根据分组列向 pandas 数据框添加一列,其中包含特定列的比例

Add a column to pandas dataframe containing the proportions for a particular column, based on grouping column

我有一些数据要执行以下操作:

虽然我不确定这是什么体面的方法,但这是我尝试过的方法:

data = pd.DataFrame(
    {
        "x": [1, 2, 3, 4] + [4, 5, 6, 7],
        "y": ["a"] * 4 + ["b"] * 4,
    }
)

给予

   x  y
0  1  a
1  2  a
2  3  a
3  4  a
4  4  b
5  5  b
6  6  b
7  7  b

然后

pd.concat(
    [
        data,
        data.groupby("y")
        .apply(lambda df: df["x"].div(df["x"].sum()))
        .reset_index()
        .rename(columns={"x": "proportion"})
        .drop(["y", "level_1"], axis=1),
    ],
    axis=1,
)

给予

   x  y  proportion
0  1  a    0.100000
1  2  a    0.200000
2  3  a    0.300000
3  4  a    0.400000
4  4  b    0.181818
5  5  b    0.227273
6  6  b    0.272727
7  7  b    0.318182

我认为你可以更轻松地做到这一点:

data["proportion"] = data["x"] / data.groupby("y")["x"].transform("sum")
print(data.to_markdown())

打印:

x y proportion
0 1 a 0.1
1 2 a 0.2
2 3 a 0.3
3 4 a 0.4
4 4 b 0.181818
5 5 b 0.227273
6 6 b 0.272727
7 7 b 0.318182