有一个像这样的数据集:

Index Role Name Grade
1 Provider Alex 7
2 Provider William 7.5
7 Provider Juan 5.5
15 Provider Pedro 4.5
25 Client George 8
26 Provider Mark 9.4
37 Client James 8.1
39 Transporter Anthony 9.5
50 Transporter Jason 7

我正在try 用相同的Role值将连续行分组.我可以用下面的句子来实现这一点:

df = df.groupby((df.Role!= df.Role.shift()).cumsum()).agg(
            Role = ('Role', 'first'),
            Name = ('Name', ' '.join), 
            Grade = ('Grade', 'mean')
        ).reset_index(drop=True)

这将使框架看起来像这样:

Index Role Name Grade
1 Provider Alex William Juan Pedro 6.125
2 Client George 8
3 Provider Mark 9.4
4 Client James 8.1
5 Transporter Anthony Jason 8.25

现在我想增加一条新的规则.我只想分组时,该索引与前一行的最大差异为5个单位:

Index Role Name Grade
1 Provider Alex William Juan 6.67
2 Provider Pedro 4.5
3 Client George 8
4 Provider Mark 9.4
5 Client James 8.1
6 Transporter Anthony 9.5
7 Transporter Jason 7

我怎么能做到这一点?此外,如果有任何分组方法更有效,欢迎.

推荐答案

您可以构建两个掩码,一个用于标识角色更改,另一个用于标识索引高于阈值(diff)的差异.然后在运行cumsum:

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

中间体:

   Index         Role     Name  Grade     m1     m2  m1|m2  cumsum
0      1     Provider     Alex    7.0   True  False   True       1
1      2     Provider  William    7.5  False  False  False       1
2      7     Provider     Juan    5.5  False  False  False       1
3     15     Provider    Pedro    4.5  False   True   True       2
4     25       Client   George    8.0   True   True   True       3
5     26     Provider     Mark    9.4   True  False   True       4
6     37       Client    James    8.1   True   True   True       5
7     39  Transporter  Anthony    9.5   True  False   True       6
8     50  Transporter    Jason    7.0  False   True   True       7

Python-3.x相关问答推荐

Django 5.0.2和django_rest_framework

如何在python中有效地使用多处理和pytube库来加快下载速度?

是什么原因导致Pandas=2.1.4和Pandas=1.4.2之间Pandas DataFrame中从Float64到int32的连续列转换方式不同

十进制浮点数到整型的转换错误

如何将参数/值从测试方法传递给pytest的fixture函数?

我没有';无法理解此TemplateDoesNotExist错误

将 rgb numpy 图像转换为 rgb 列表和相应的索引值

无法使用 curve_fit() 在 python 中复制高斯函数的曲线拟合

使用 python 查找标记的元素

删除给定数组中所有元素为True的所有子数组

获取字符串中的两个工作日之间的差异

考虑到Pandas 系列中的不同索引,如何正确估计两列的百分比变化? Python相关

使用 selenium 加速网页抓取

如何在python 3.10中将列表项(字符串类型)转换为模块函数

PyQt:退出时没有错误消息(回溯)

在python中基于列表理解的条件下跳过元素

如何在 Spyder 控制台中使用变量执行 Python 3.3 脚本?

Anaconda 中的依赖项和包冲突?

定义 True,如果没有定义,会导致语法错误

变量类型注解NameError不一致