如何在Pandas中基于相邻列指定值计算对应Qty列的平均值
解决方案
方法思路
核心是先把不符合条件的qty值标记为NaN,再利用pandas的mean()自动忽略NaN的特性计算每行平均值,这种方法比apply()效率高很多,更适配大规模数据集。
代码实现
import pandas as pd # 构造示例数据集 data = { '销售额': [42, 56, 78], 'yr10cd': ['A', 'T', 'A'], 'yr10qty': [45, 58, 75], 'yr9cd': ['A', 'A', '0'], 'yr9qty': [47, 52, 0], 'yr8cd': ['A', '0', '0'], 'yr8qty': [49, 0, 0] } df = pd.DataFrame(data) # 提取所有年份对应的cd和qty列对(实际场景可扩展到yr1) year_suffixes = ['10', '9', '8'] valid_qty_cols = [] for suffix in year_suffixes: cd_col = f'yr{suffix}cd' qty_col = f'yr{suffix}qty' # 仅保留cd列为"A"的qty值,其余设为NaN df[f'valid_{qty_col}'] = df[qty_col].where(df[cd_col] == 'A') valid_qty_cols.append(f'valid_{qty_col}') # 计算每行平均值并新增列 df['平均值'] = df[valid_qty_cols].mean(axis=1) # 可选:删除中间生成的valid列 df = df.drop(valid_qty_cols, axis=1) print(df)
代码说明
- 列配对处理:通过年份后缀匹配对应的
cd标识列和qty数值列,确保每一组对应关系准确。 - 有效值过滤:用
where()方法,当cd列不等于"A"时,将对应qty值转为NaN,后续计算平均值时会自动排除这些无效值。 - 高效计算:直接用
mean(axis=1)按行计算平均值,避免了apply()逐行循环的低效问题,尤其适合大规模数据集。
你之前方法出错的可能原因
用apply()加if语句时,大概率是这两个问题:
- 判断条件有误:比如把数据里的
0当成字符串处理,但实际是数值类型,导致判断不生效,没收集到符合条件的值; - 空列表处理不当:如果代码默认在无符合条件值时返回0,且逻辑错误导致所有行都没收集到有效数据,就会出现全0的结果。
内容的提问来源于stack exchange,提问作者Taylor3417
相关产品推荐
相关产品推荐

