熊猫的数学运算,取决于列值

时间:2018-06-26 03:05:11

标签: python pandas

我需要进行数学运算,该运算取决于第二列中的值。这是设置。

给出一个简单的数据框(df):

df = pd.DataFrame({
    'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
    'col2' : [2, 1, 9, 8, 7, 4],
    'col3': [0, 1, 9, 4, 2, 3],
    })

In [11]: df
Out[11]: 
  col1  col2  col3
0    A     2     0
1    A     1     1
2    B     9     9
3  NaN     8     4
4    D     7     2
5    C     4     3

我可以添加一个新列(math),然后使用基于10和col3之和的数学表达式填充它。

df['math'] = 10 + df['col3']

In [14]: df
Out[14]: 
  col1  col2  col3  math
0    A     2     0    10
1    A     1     1    11
2    B     9     9    19
3  NaN     8     4    14
4    D     7     2    12
5    C     4     3    13

但是我不知道的是如何使表达式取决于另一列中的值(例如,仅当col1 == B时)。所需的输出将是:

In [14]: df
Out[14]: 
  col1  col2  col3  math
0    A     2     0   NaN
1    A     1     1   NaN
2    B     9     9    19
3  NaN     8     4   NaN
4    D     7     2   NaN
5    C     4     3   NaN

为进一步说明,我将为col1中的for loop值使用一个变量。结果,我无法使.group_by()herehere那样工作。我想我正在寻找这样的东西...

df['math'] = 10 + df.loc[[df['col1'] == my_var], 'col3']
我从上面第二个示例的注释中得到了

,但是我无法使其正常工作。它为太多的值抛出了ValueError--也就是说,我试图同时传递过滤器和操作列,但它只是期望过滤器。 This帖子还使用了.loc,类似于我上面的表达式-但带有静态的col1

5 个答案:

答案 0 :(得分:5)

where

我执行数学运算,然后通过传递布尔级数pandas.Series.where

使用df.col1.eq('B')对其进行掩盖

df.assign(math=df.col3.add(10).where(df.col1.eq('B')))

  col1  col2  col3  math
0    A     2     0   NaN
1    A     1     1   NaN
2    B     9     9  19.0
3  NaN     8     4   NaN
4    D     7     2   NaN
5    C     4     3   NaN

答案 1 :(得分:4)

使用 loc

df['math'] = df.loc[df.col1.eq('B'), 'col3'].add(10)

  col1  col2  col3  math
0    A     2     0   NaN
1    A     1     1   NaN
2    B     9     9  19.0
3  NaN     8     4   NaN
4    D     7     2   NaN
5    C     4     3   NaN

答案 2 :(得分:2)

使用:(不是安全的方法,请参见下面的注释)

df['New']=df.col3[df.col1=='B']+10
df
Out[11]: 
  col1  col2  col3   New
0    A     2     0   NaN
1    A     1     1   NaN
2    B     9     9  19.0
3  NaN     8     4   NaN
4    D     7     2   NaN
5    C     4     3   NaN

更新

pd.concat([df,(df.col3[df.col1=='B']+10).to_frame('New')],1)
Out[51]: 
  col1  col2  col3   New
0    A     2     0   NaN
1    A     1     1   NaN
2    B     9     9  19.0
3  NaN     8     4   NaN
4    D     7     2   NaN
5    C     4     3   NaN

答案 3 :(得分:0)

由于您未正确使用loc,因此引发了ValueError。这是使用loc的解决方案:

df.loc[:,'math'] = 10 + df.loc[df['col1'] == "B", 'col3']

输出:

 col1 col2 col3 math
0    A   2   0    NaN
1    A   1   1    NaN
2    B   9   9    19.0
3    NaN 8   4    NaN
4    D   7   2    NaN
5    C   4   3    NaN

答案 4 :(得分:0)

我还可以执行以下操作...

df['math'] = 10 + df.loc[df['col1'] == 'B']['col3']  

这是上述@ user3483203答案的变体。最终,我的'B'是一个变量,所以我修改了@RafaelC的注释。