pandas-分类变量的百分比计数

Tun*_*ung 4 python dataframe pandas pandas-groupby

我有一个 pandas df 喜欢

df_test = pd.DataFrame({'A': 'a a a b b'.split(), 'B': ['Y','N','Y','Y','N']})

我想要的输出是 df_test2 = pd.DataFrame({'A': 'a b'.split(), 'B': [2/3,1/2]}) How would you do a groupby().apply by A 列来获取 B 列中“Y”的百分比?

我一直在搜索 groupby.apply() 但到目前为止没有任何效果谢谢!

Fre*_*076 13

个人最喜欢的方式:

df.column_name.value_counts() / len(df)
Run Code Online (Sandbox Code Playgroud)

给出一个系列,其中列的值作为索引,比例作为值。


Roh*_*ndi 8

这是一个通用的解决方案,在使用 groupby 之前不会更改表或进行任何类型的过滤或转换。

> s = df_test.groupby(['A'])['B'].value_counts(normalize=True)
> print(s)

A  B
a  Y    0.666667
   N    0.333333
b  N    0.500000
   Y    0.500000
Name: B, dtype: float64
Run Code Online (Sandbox Code Playgroud)

上面的变量s是一个多索引系列,您可以使用 .loc访问任何行

> s.loc[:,'Y']
A
a    0.666667
b    0.500000
Name: B, dtype: float64
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用同一系列访问有关“N”的详细信息。

> s.loc[:,'N']
A
a    0.333333
b    0.500000
Name: B, dtype: float64
Run Code Online (Sandbox Code Playgroud)

PS: 如果您想更好地理解groupby,请尝试解码此代码,该代码与上面的代码完全相同,但仅更改了列名称和结果。

> r = df_test.groupby(['B'])['A'].value_counts(normalize=True)
> print(r)
B  A
N  a    0.500000
   b    0.500000
Y  a    0.666667
   b    0.333333
Name: A, dtype: float64
Run Code Online (Sandbox Code Playgroud)

> r.loc['Y',:]
B  A
Y  a    0.666667
   b    0.333333
Name: A, dtype: float64
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 5

GroupBy.mean与布尔掩码一起使用,其中Trues 是类似 的进程1,不需要新列,因为也传递Series df_test["A"]groupby

注意:

相反, ==用于eq更清晰的语法。

df = df_test["B"].eq('Y').groupby(df_test["A"]).mean().reset_index()
print (df)
   A         B
0  a  0.666667
1  b  0.500000
Run Code Online (Sandbox Code Playgroud)