我需要进行数学运算,该运算取决于第二列中的值。这是设置。
给出一个简单的数据框(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()
像here或here那样工作。我想我正在寻找这样的东西...
df['math'] = 10 + df.loc[[df['col1'] == my_var], 'col3']
我从上面第二个示例的注释中得到了,但是我无法使其正常工作。它为太多的值抛出了ValueError
--也就是说,我试图同时传递过滤器和操作列,但它只是期望过滤器。 This帖子还使用了.loc
,类似于我上面的表达式-但带有静态的col1
。
答案 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的注释。