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)
给出一个系列,其中列的值作为索引,比例作为值。
这是一个通用的解决方案,在使用 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)
GroupBy.mean
与布尔掩码一起使用,其中True
s 是类似 的进程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)
归档时间: |
|
查看次数: |
15192 次 |
最近记录: |