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
由于列名与
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