如何在Pandas中基于同行基准单元格对每行单元格应用函数?
解决Pandas中按同行基准值修改多列的问题
首先构造示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'a': [1, 1], 'b': [2, 5], 'benchmark': [1, 3] })
方法一:按行apply处理(直观易读)
直接针对a、b列,按行判断每个值是否大于同行的benchmark,不满足则设为0,原地修改原列:
df[['a', 'b']] = df.apply( lambda row: [val if val > row['benchmark'] else 0 for val in [row['a'], row['b']]], axis=1, result_type='expand' )
axis=1指定按行处理,每一行的row对象可以访问所有列的值result_type='expand'将返回的列表展开为列,直接覆盖原a、b列
方法二:矢量化操作(性能优先,推荐大数据集)
利用Pandas的广播特性,无需循环,直接对整列进行条件判断,性能远高于逐行apply:
# 单列逐个处理 df['a'] = df['a'].where(df['a'] > df['benchmark'], 0) df['b'] = df['b'].where(df['b'] > df['benchmark'], 0) # 多列批量处理(更简洁) df[['a', 'b']] = df[['a', 'b']].where(df[['a', 'b']] > df['benchmark'].values[:, None], 0)
where函数会保留满足条件的值,将不满足的替换为指定的0df['benchmark'].values[:, None]将基准列转换为列向量,实现和a、b列的广播比较
处理后最终的DataFrame:
| a | b | benchmark | |
|---|---|---|---|
| 0 | 0 | 2 | 1 |
| 1 | 0 | 5 | 3 |
内容的提问来源于stack exchange,提问作者chi11ax
相关产品推荐
相关产品推荐

