Pandas 数据处理 / 数据框赋值
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
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