Pandas 数据整理/数据帧分配

问题描述 投票:0回答:1
sample_data = {
    'Class': ['TEST', 'NOT TEST', 'TEST 123', 'SOMETHING ELSE', 'TEST'],
    'Values': ['1.3 / 4.5', '1.5', '0.7 / 5.2', '123', '1.5 / 4.0']
}

df = pd.DataFrame(sample_data)
mask = df['Class'].str.startswith('TEST')
# I WANT TO DO SOMETHING LIKE THIS -->
df.loc[mask, ['COL1', 'COL2']] = df.loc[mask, 'Values'].str.split(' / ', expand=True)

df.head()

我为所有行的 COL1 和 COL2 获取 Nan。我的期望是,我将仅获得与掩码匹配的行的分割值,而其他行则获得 Nan。

我已经阅读了 pandas 文档(显然还不够)并且一直在使用 AI,但它让我陷入了困境。显然我迷失在杂草中,不明白一些我认为应该非常简单的事情。也许有副本之类的东西。

熊猫

我期望并且我想要的是,我会在 COL1 和 COL2 中获取以“TEST”开头的行的值。对于 COL1 和 COL2,其他行将为 NaN。

我理解为什么下面的代码不起作用(正在处理副本),但我不明白为什么原始片段不起作用:

df_subset = df[mask]
df_subset[['COL1', 'COL2']] = df_subset['Values'].str.split(' / ', expand=True)
df.head() #NOTHING CHANGED AS EXPECTED BUT df_subset is as expected
pandas dataframe data-science data-wrangling exploratory-data-analysis
1个回答
0
投票

由于列名与

split
的输出不对齐(列为 0/1),因此您应该使用底层 numpy 数组:

df.loc[mask, ['COL1', 'COL2']] = df.loc[mask, 'Values'].str.split(' / ', expand=True).values

输出:

            Class     Values COL1 COL2
0            TEST  1.3 / 4.5  1.3  4.5
1        NOT TEST        1.5  NaN  NaN
2        TEST 123  0.7 / 5.2  0.7  5.2
3  SOMETHING ELSE        123  NaN  NaN
4            TEST  1.5 / 4.0  1.5  4.0

df.loc[mask, 'Values'].str.split(' / ', expand=True)
的输出:

     0    1 # not aligned with COL1/COL2
0  1.3  4.5
2  0.7  5.2
4  1.5  4.0
© www.soinside.com 2019 - 2024. All rights reserved.