给出以下数据框:
DF = pd.DataFrame({'Site': ['A', 'A', 'A', 'A', 'B', 'B','B','B'],
'Score': [1, -1, -0.5, 1, 0, -1, 2, 4],
'Group': [1, 1, 2, 2, 1, 1, 2, 2]})
DF
Group Score Site
0 1 1.0 A
1 1 -1.0 A
2 2 -0.5 A
3 2 1.0 A
4 1 0.0 B
5 1 -1.0 B
6 2 2.0 B
7 2 4.0 B
我想让pandas添加一个列,显示每个站点的得分等于或大于0的行百分比(即站点B中4行中的3行为零或以上,因此结果为75% )和另一列显示每个站点内的组百分比(即站点A中的组1在2中有1个得分,其为零或以上,因此结果为50%)。期望的结果如下:
Group Score Site Site% SiteGroup%
0 1 1.0 A 0.5 0.5
1 1 -1.0 A 0.5 0.5
2 2 -0.5 A 0.5 0.5
3 2 1.0 A 0.5 0.5
4 1 0.0 B 0.75 0.5
5 1 -1.0 B 0.75 0.5
6 2 2.0 B 0.75 1
7 2 4.0 B 0.75 1
提前致谢!
答案 0 :(得分:1)
你可以尝试:
df['score_indicator'] = df.Score.apply(lambda x: 1 if x >=0 else 0)
df['Site%'] = df.groupby('Site')['score_indicator'].transform(lambda x: x.sum() / x.count())
df['Group%'] = df.groupby(['Site','Group'])['score_indicator'].transform(lambda x: x.sum() / x.count())
获取
print(df)
Group Score Site score_indicator Site% Group%
0 1 1.0 A 1 0.50 0.50
1 1 -1.0 A 0 0.50 0.50
2 2 -0.5 A 0 0.50 0.75
3 2 1.0 A 1 0.50 0.75
4 1 0.0 B 1 0.75 0.50
5 1 -1.0 B 0 0.75 0.50
6 2 2.0 B 1 0.75 0.75
7 2 4.0 B 1 0.75 0.75