【发布时间】:2018-12-04 16:02:54
【问题描述】:
我需要根据第二列中的值进行数学运算。这是设置。
给定一个简单的数据框 (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
为了进一步说明,我将在for loop 中使用col1 值的变量。结果,我无法让.group_by() 像here 或here 所描述的那样工作。我想我正在寻找这样的东西......
df['math'] = 10 + df.loc[[df['col1'] == my_var], 'col3']
我从上面第二个示例中的评论中得到 - 但我无法让它工作。它会为太多值抛出ValueError - 也就是说,我试图同时传递过滤器和操作列,但它只期待过滤器。 This SO 帖子也使用类似于我上面的表达式的.loc - 但使用静态col1。
【问题讨论】:
-
你的表达几乎是对的。你的意思是
df.loc[:,'math'] = 10 + df.loc[df['col1'] == "B", 'col3'] -
@RafaelC,事实上,这就是我想要做的。至少在右手边。
df['math']与df.loc[:, 'math']有什么区别?