首页 > 解决方案 > 使用 pandas groupby 基于多列求和

问题描述

我想创建一个新列,该列根据多列的分组汇总列。在这个例子中,我想得到每个ISIN日期投资组合的总和。

df = pd.DataFrame({"ISIN": ["IS123", "IS123", "UN123", "UN123", "FA123"],
                     "date": ["16", "16", "18", "18", "22"],
                     "portfolio": ["A", "A", "B", "A", "D"],
                     "value": [400, 300, 200, 600, 500]})

这是所需的输出。如您所见,只有前两行“满足”条件,并且两行的总和为700。其他人将保持各自的价值。

df = pd.DataFrame({"ISIN": ["IS123", "IS123", "UN123", "UN123", "FA123"],
                     "date": ["16", "16", "18", "18", "22"],
                     "portfolio": ["A", "A", "B", "A", "D"],
                     "value": [400, 300, 200, 600, 500],
                     "Sum per ISIN, date and portfolio": [700, 700, 200, 600, 500]})

这是我尝试过的方法,但我只能让它在一个列上进行分组,例如ISIN

df["Sum per ISIN, date and portfolio"] = df["value"].groupby(df["ISIN", "date", "portfolio"]).transform("sum")

标签: pythonpandassumpandas-groupby

解决方案


尝试groupby使用 DataFrame 而不是 Series ( value),然后从 grouper 中选择列:

df["Sum per ISIN, date and portfolio"] = (
    df.groupby(["ISIN", "date", "portfolio"])["value"].transform("sum")
)
    ISIN date portfolio  value  Sum per ISIN, date and portfolio
0  IS123   16         A    400                               700
1  IS123   16         A    300                               700
2  UN123   18         B    200                               200
3  UN123   18         A    600                               600
4  FA123   22         D    500                               500

推荐阅读