拥有这样的数据集:
索引 | 角色 | 姓名 | 等级 |
---|---|---|---|
1 | 提供商 | 亚历克斯 | 7 |
2 | 提供商 | 威廉 | 7.5 |
7 | 提供商 | 胡安 | 5.5 |
15 | 提供商 | 佩德罗 | 4.5 |
25 | 客户 | 乔治 | 8 |
26 | 提供商 | 马克 | 9.4 |
37 | 客户 | 詹姆斯 | 8.1 |
39 | 运输机 | 安东尼 | 9.5 |
50 | 运输车 | 杰森 | 7 |
我正在尝试使用相同的 Role 值对连续行进行分组。我可以通过使用以下句子来实现这一点:
df = df.groupby((df.Role!= df.Role.shift()).cumsum()).agg(
Role = ('Role', 'first'),
Name = ('Name', ' '.join),
Grade = ('Grade', 'mean')
).reset_index(drop=True)
这将使数据框看起来像这样:
索引 | 角色 | 姓名 | 等级 |
---|---|---|---|
1 | 提供商 | 亚历克斯·威廉·胡安·佩德罗 | 6.125 |
2 | 客户 | 乔治 | 8 |
3 | 提供商 | 马克 | 9.4 |
4 | 客户 | 詹姆斯 | 8.1 |
5 | 运输车 | 安东尼·杰森 | 8.25 |
现在我想添加一条新规则。我只想在数据帧索引与上一行最多相差 5 个单位时进行分组:
索引 | 角色 | 姓名 | 等级 |
---|---|---|---|
1 | 提供商 | 亚历克斯·威廉·胡安 | 6.67 |
2 | 提供商 | 佩德罗 | 4.5 |
3 | 客户 | 乔治 | 8 |
4 | 提供商 | 马克 | 9.4 |
5 | 客户 | 詹姆斯 | 8.1 |
6 | 运输机 | 安东尼 | 9.5 |
7 | 运输机 | 杰森 | 7 |
我怎样才能实现这个目标?另外如果有更高效的分组方法也欢迎。
您可以构建两个掩码,一个用于识别角色变化,另一个用于识别高于阈值的索引差异:
m1 = df.Role!= df.Role.shift()
m2 = df['Index'].diff().gt(5)
out = df.groupby((m1|m2).cumsum()).agg(
Role = ('Role', 'first'),
Name = ('Name', ' '.join),
Grade = ('Grade', 'mean')
).reset_index(drop=True)
输出:
Role Name Grade
0 Provider Alex William Juan 6.666667
1 Provider Pedro 4.500000
2 Client George 8.000000
3 Provider Mark 9.400000
4 Client James 8.100000
5 Transporter Anthony 9.500000
6 Transporter Jason 7.000000