Pandas 根据索引对相等的连续列值进行分组

问题描述 投票:0回答:1

拥有这样的数据集:

索引 角色 姓名 等级
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

我怎样才能实现这个目标?另外如果有更高效的分组方法也欢迎。

python-3.x pandas
1个回答
0
投票

您可以构建两个掩码,一个用于识别角色变化,另一个用于识别高于阈值的索引差异:

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
© www.soinside.com 2019 - 2024. All rights reserved.