[英]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.