Pandas条件更新数据帧值

时间:2017-03-19 07:46:25

标签: python-2.7 pandas

我有一个数据框:

    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。

2 个答案:

答案 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