You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:30:53