我有一个数据框:
col1 col2 col3 col4
1 1 20 AA NaN
2 2 10 BB NaN
3 3 20 CC NaN
4 1 30 AA NaN
5 2 10 BB NaN
我需要更新col4,以便:
if col3 == 'AA':
return col2 + col1
elif col2 == 'BB':
return col2 - col1
else:
return
所以输出看起来像这样:
col1 col2 col3 col4
1 1 20 AA 21
2 2 10 BB 8
3 3 20 CC NaN
4 1 30 AA 31
5 2 10 BB 8
我试过了:
df['col4'][df['col3']=='AA'] = df['col2'] + df['col1']
df['col4'][df['col3']=='AA'] = df['col2'] + df['col1']
当然我得到了一个SettingWithCopyWarning
在没有警告的情况下实现此目的的正确方法是什么?我已尝试过apply和set_value,但我似乎无法将这么多df引用传递给params。
答案 0 :(得分:4)
您可以使用嵌套的np.where():
In [5]: df['col4'] = np.where(df.col3 == 'AA',
df.col2 + df.col1,
np.where(df.col3 == 'BB',
df.col2 - df.col1,
np.nan))
In [6]: df
Out[6]:
col1 col2 col3 col4
1 1 20 AA 21.0
2 2 10 BB 8.0
3 3 20 CC NaN
4 1 30 AA 31.0
5 2 10 BB 8.0
答案 1 :(得分:1)
一种不常见的模式: - )
a = ((df.col3.values[:, None] == ['AA', 'BB']) * [1, -1]).sum(1, keepdims=True)
b = np.hstack([np.ones_like(a), np.where(a == 0, np.nan, a)])
df.assign(col4=df[['col1', 'col2']].mul(b).sum(1, skipna=False))
col1 col2 col3 col4
1 1 20 AA 21.0
2 2 10 BB -8.0
3 3 20 CC NaN
4 1 30 AA 31.0
5 2 10 BB -8.0