如何用Pandas按分组实现跨列行的乘除运算(表格不可重构)
解决方案
先模拟你的数据结构(方便演示):
import pandas as pd data = { 'Year': [2020, 2020, 2021, 2021], 'Country': ['USA', 'USA', 'Canada', 'Canada'], 'A': [10, None, 20, None], 'B': [None, 5, None, 4] } df = pd.DataFrame(data)
方法1:用transform直接映射分组有效值到每行
这种方法保留原数据所有行,给每行添加上对应分组的A、B有效值后计算目标列:
# 提取每组的A有效值,映射到组内所有行 df['A_valid'] = df.groupby(['Year', 'Country'])['A'].transform(lambda x: x.dropna().iloc[0]) # 提取每组的B有效值,映射到组内所有行 df['B_valid'] = df.groupby(['Year', 'Country'])['B'].transform(lambda x: x.dropna().iloc[0]) # 计算C和D df['C'] = df['A_valid'] / df['B_valid'] df['D'] = df['A_valid'] * df['B_valid'] # 可选:删除中间辅助列 df = df.drop(['A_valid', 'B_valid'], axis=1)
方法2:先聚合再合并
如果需要先查看每组的A、B聚合结果,再合并回原数据计算:
# 按Year和Country聚合,提取每组的A、B有效值 aggregated = df.groupby(['Year', 'Country']).agg( A_valid=('A', lambda x: x.dropna().iloc[0]), B_valid=('B', lambda x: x.dropna().iloc[0]) ).reset_index() # 把聚合结果合并回原数据 df = df.merge(aggregated, on=['Year', 'Country']) # 计算目标列 df['C'] = df['A_valid'] / df['B_valid'] df['D'] = df['A_valid'] * df['B_valid']
异常处理(可选)
如果存在某组无A或B有效值的情况,为避免报错,可修改lambda表达式:
lambda x: x.dropna().iloc[0] if not x.dropna().empty else None
这样遇到空值时会生成NaN,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Solrac
相关产品推荐
相关产品推荐

