我有一只大熊猫喜欢
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]}) 你如何做一个groupby() . 按A列应用以获得B列中'Y'的百分比?
df_test2 = pd.DataFrame({'A': 'a b'.split(), 'B': [2/3,1/2]})
我一直在搜索groupby.apply()但到目前为止没有任何工作谢谢!
一种方法可能是
In [10]: df_test.groupby('A').B.apply(lambda x: (x == 'Y').mean()) Out[10]: A a 0.666667 b 0.500000
或者,如果您不介意在此过程中更改 df_test ,
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
使用带有布尔掩码的GroupBy.mean,其中 True 是像 1 这样的进程,不需要新列,因为也是 Series df_test["A"] 到 groupby :
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 回答
一种方法可能是
或者,如果您不介意在此过程中更改
df_test
,使用带有布尔掩码的GroupBy.mean,其中
True
是像1
这样的进程,不需要新列,因为也是Series
df_test["A"]
到groupby
:注意:
相反,
==
用于eq以获得更清晰的语法 .