簡體   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