我有一个这样的数据框
df = pd.DataFrame({'Client': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
'Project': ['P1', 'P2', 'P3', 'P4', 'P2', 'P3', 'P1', 'P2', 'P4'],
'Freq': [5, 2, 3, 4, 6, 9, 7, 2, 4]})
Client Project Freq
0 A P1 5
1 A P2 2
2 A P3 3
3 A P4 4
4 B P2 6
5 B P3 9
6 B P1 7
7 C P2 2
8 C P4 4
我想实现这一目标:
Client Project Top 1 Project Top 2 Project Top 3
0 A P1 P4 P3
1 B P3 P1 P2
2 C P4 P2 -
但是我不知道如何操作和提取组中每个顶级项目。
希望您能帮助我,谢谢。
答案 0 :(得分:2)
首先在两列中依次使用DataFrame.sort_values
,降序为Freq
。然后按GroupBy.cumcount
创建计数器,按最高值过滤并按Series.unstack
重塑形状:
N = 3
df = df.sort_values(['Client','Freq'], ascending=[True, False])
g = df.groupby('Client').cumcount().add(1)
mask = g <= N
df = (df[mask].set_index(['Client',g[mask]])['Project']
.unstack()
.add_prefix('Project Top ')
.reset_index())
print (df)
Client Project Top 1 Project Top 2 Project Top 3
0 A P1 P4 P3
1 B P3 P1 P2
2 C P4 P2 NaN