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
为了进一步说明,我将使用一个变量作为 a 中的col1
值for loop
。结果,我无法按照此处或此处.group_by()
的描述工作。我想我正在寻找这样的东西......
df['math'] = 10 + df.loc[[df['col1'] == my_var], 'col3']
我从上面第二个示例中的评论中得到 - 但我无法让它工作。它抛出了ValueError
太多的值 - 也就是说,我试图同时传递过滤器和操作列,但它只期待过滤器。 这篇SO 帖子也使用了.loc
类似于我上面的表达式 - 但使用了 static col1
。
解决方案
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
推荐阅读
- gradle - 当定义多个后端时,asciidoctorj-pdf 会产生 ArrayIndexOutOfBoundsException
- jmeter - 如何设置嵌套的 ForEach 控制器并在 JMeter 上发送子请求
- excel - 是否可以重复特定操作两次但仅在星期一?
- javascript - CSS-in-JS 不会阻止浏览器进行 CSS 缓存吗?
- android - 对于版本 4.10.1,Gradle 的依赖项缓存可能已损坏(有时会在网络连接超时后发生。)
- javascript - 从活动的 Firefox DOM 中删除一个节点
- apostrophe-cms - ApostropheCMS:登录后重定向到上一页
- excel - 在 VBA 中将特定的 CSV 添加到工作簿
- python - 检测布尔值从真到假的变化,反之亦然
- php - 两个点 vs dirname(__DIR__) 用于 require 和其他情况