我有以下数据框:
import pandas as pd
import numpy as np
np.random.seed(123)
n = 10
df = pd.DataFrame({"val": np.random.randint(1, 10, n),
"cat": np.random.choice(["X", "Y", "Z"], n)})
val cat
0 3 Z
1 3 X
2 7 Y
3 2 Z
4 4 Y
5 7 X
6 2 X
7 1 X
8 2 X
9 1 Y
我想知道每个类别 X
、Y
和 Z
在整个 val
列总和中所占的百分比。我可以像这样聚合 df
:
total_sum = df.val.sum()
#32
s = df.groupby("cat").val.sum().div(total_sum)*100
#this is the desired result in % of total val
cat
X 46.875 #15/32
Y 37.500 #12/32
Z 15.625 #5/32
Name: val, dtype: float64
然而,令我感到惊讶的是,pandas 似乎没有像 df.groupby("cat").val.freq()
而不是 df.groupby("cat").val.sum()
或 df.groupby("cat").val.mean()
这样的百分比/频率函数。我认为这是一个常见的操作,Series.value_counts
已经用 normalize=True
实现了这个 - 但是对于 groupby 聚合,我找不到任何类似的东西。我在这里遗漏了什么还是确实没有开箱即用的功能?