繁体   English   中英

Groupby 列和聚合连续行

[英]Groupby column and aggregate consecutive rows

我在下面有 dataframe。 我想为 class 数字获取一个 groupby 仅用于连续值,并创建以下 output。 我认为有一个现有的 function 可以折叠行但不确定它是哪一个。

INPUT 
Class 编号 开始 结尾 长度
1 58.063 58.169 0.106
1 58.169 58.25 0.081
1 58.25 58.45 0.2
1 58.45 58.567 0.117
1 58.567 58.585 0.018
2 58.585 58.748 0.163
2 58.748 58.85 0.102
2 58.85 58.979 0.129
2 58.979 59.078 0.099
2 59.078 59.175 0.097
2 59.175 59.287 0.112
2 59.287 59.408 0.121
2 59.408 59.558 0.15
2 59.558 59.742 0.184
2 59.742 59.853 0.111
2 59.853 59.891 0.038
2 59.891 60.159 0.268
2M 60.159 60.176 0.017
2M 60.176 60.337 0.161
2M 60.337 60.41 0.073
2M 60.41 60.499 0.089
2M 60.499 60.656 0.157
2M 60.656 60.776 0.12
2M 60.776 60.874 0.098
2M 60.874 61.004 0.13
2M 61.004 61.226 0.222
2M 61.226 61.246 0.02
2M 61.246 61.499 0.253
2 61.499 61.547 0.048
2 61.547 62.156 0.609
OUTPUT
Class 编号 开始 结尾 长度
1 58.063 58.585 0.522
2 58.585 60.159 1.574
2M 60.159 61.499 1.34
2 61.499 62.156 0.657

根据'Class Number'的变化,尝试使用groupby aggregate通过cumsum创建的组:

new_df = (
    df.groupby(df['Class Number'].ne(df['Class Number'].shift()).cumsum())
        .aggregate({'Class Number': 'first',
                    'Start': 'first',
                    'End': 'last',
                    'Length': 'sum'})
        .reset_index(drop=True)
)

new_df

  Class Number   Start     End  Length
0            1  58.063  58.585   0.522
1            2  58.585  60.159   1.574
2           2M  60.159  61.499   1.340
3            2  61.499  62.156   0.657

或者,如果'Start''End'值而不是'first''last'应该是'min''max'


new_df = (
    df.groupby(df['Class Number'].ne(df['Class Number'].shift()).cumsum())
        .aggregate({'Class Number': 'first',
                    'Start': 'min',
                    'End': 'max',
                    'Length': 'sum'})
        .reset_index(drop=True)
)

在这种情况下,结果与上述相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM