类别变量的熊猫百分比计数

时间:2018-12-09 07:28:18

标签: python pandas dataframe pandas-groupby

我有喜欢的熊猫dp

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]}) 您将如何在group列上进行groupby()。apply以获取B列中“ Y”的百分比?

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

4 个答案:

答案 0 :(得分:1)

一种方法可能是

In [10]: df_test.groupby('A').B.apply(lambda x: (x == 'Y').mean())
Out[10]:
A
a    0.666667
b    0.500000

或者,如果您不介意在此过程中更改df_test

In [15]: df_test['C'] = df_test.B == 'Y'
In [17]: df_test.groupby('A').C.mean()
Out[17]:
A
a    0.666667
b    0.500000
Name: C, dtype: float64

答案 1 :(得分:0)

GroupBy.mean与布尔掩码一起使用,其中True是类似于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

答案 2 :(得分:0)

个人喜爱的方式:

df.column_name.value_counts() / len(df)

给出一系列以列的值作为索引,以比例的值作为值。

答案 3 :(得分:0)

这是一种通用解决方案,在使用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

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

> s.loc[:,'Y']
A
a    0.666667
b    0.500000
Name: B, dtype: float64

类似地,您可以使用相同的系列访问有关“ N”的详细信息。

> s.loc[:,'N']
A
a    0.333333
b    0.500000
Name: B, dtype: float64

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

> r.loc['Y',:]
B  A
Y  a    0.666667
   b    0.333333
Name: A, dtype: float64