我有喜欢的熊猫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(),但到目前为止没有任何效果 谢谢 !
答案 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