如何在pandas中基于标识列对指定列进行条件求平均计算
Pandas按条件创建新列高效实现方案
直接使用Pandas+Numpy的向量化操作即可实现,不需要调用apply遍历行,也不需要创建额外中间列,性能远高于行遍历方案:
核心实现代码
import numpy as np import pandas as pd # 构造示例数据集 cols = ['A','A_flag','B','B_flag'] d= [(5,False,3,False),(2,False,7,True),(1,True,10,True),(12,True,2,False)] df=pd.DataFrame(columns=cols,data=d) # 核心逻辑 # 1. 生成符合条件的行掩码:A_flag或B_flag至少一个为True mask = df['A_flag'] | df['B_flag'] # 2. 按条件赋值,不符合的行默认返回NaN df['avg_col'] = np.where(mask, (df['A'] + df['B'])/2, np.nan)
输出结果
运行后df的avg_col列值如下:
| 行索引 | avg_col |
|---|---|
| 0 | NaN |
| 1 | 4.5 |
| 2 | 5.5 |
| 3 | 7.0 |
补充说明
如果你实际需求是仅对flag为True的列的数值取平均(比如只有B_flag为True时仅计算B的平均值,只有A_flag为True时仅计算A的平均值,两个都为True时算A+B的平均),可以用以下逻辑实现:
# 计算有效列的数值和,以及有效列数量 valid_sum = df['A'] * df['A_flag'] + df['B'] * df['B_flag'] valid_count = df['A_flag'].astype(int) + df['B_flag'].astype(int) # 有效列数量为0时返回NaN,否则返回平均 df['avg_col'] = np.where(valid_count > 0, valid_sum / valid_count, np.nan)
以上两种实现均为全向量化操作,数据量越大性能优势越明显。
内容的提问来源于stack exchange,提问作者Chris L
相关产品推荐
相关产品推荐

