根据分组列向 pandas 数据框添加一列,其中包含特定列的比例
Add a column to pandas dataframe containing the proportions for a particular column, based on grouping column
我有一些数据要执行以下操作:
- 按一组列 G
分组
- 对于每个分组,查找组中特定列的比例
- return 包含附加比例列的完整数据
虽然我不确定这是什么体面的方法,但这是我尝试过的方法:
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
我有一些数据要执行以下操作:
- 按一组列 G 分组
- 对于每个分组,查找组中特定列的比例
- return 包含附加比例列的完整数据
虽然我不确定这是什么体面的方法,但这是我尝试过的方法:
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 |