Pandas 数据处理 / 数据框赋值

1 投票
1 回答
29 浏览
提问于 2025-04-12 04:04
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来帮助我,但它让我更加迷茫。显然,我在一些细节上搞不清楚,感觉这应该是个很简单的事情。可能是跟复制有关。

Pandas

我希望的是,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

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

撰写回答