gpt4 book ai didi

python - 根据条件合并行 Pandas 数据框

转载 作者:太空狗 更新时间:2023-10-30 00:47:42 25 4
gpt4 key购买 nike

你好,有一个数据框 df

包含一组事件(行)。

df = pd.DataFrame(data=[[1, 2,   7, 10],
[10, 22, 1, 30],
[30, 42, 2, 10],
[100,142, 22,1],
[143, 152, 2, 10],
[160, 162, 12, 11]],columns=['Start','End','Value1','Value2'])

df
Out[15]:
Start End Value1 Value2
0 1 2 7 10
1 10 22 1 30
2 30 42 2 10
3 100 142 22 1
4 143 152 2 10
5 160 162 12 11

如果 2 个(或更多)连续事件 <= 10 远,我想合并 2(或更多)事件(即使用第一个事件的开始,最后一个事件的结束并对 Value1 和中的值求和值 2).

在上面的例子中 df 变成:

 df
Out[15]:
Start End Value1 Value2
0 1 42 10 50
1 100 162 36 22

最佳答案

这完全有可能:

df.groupby(((df.Start  - df.End.shift(1)) > 10).cumsum()).agg({'Start':min, 'End':max, 'Value1':sum, 'Value2': sum})

解释:

start_end_differences = df.Start  - df.End.shift(1) #shift moves the series down
threshold_selector = start_end_differences > 10 # will give you a boolean array where true indicates a point where the difference more than 10.
groups = threshold_selector.cumsum() # sums up the trues (1) and will create an integer series starting from 0
df.groupby(groups).agg({'Start':min}) # the aggregation is self explaining

这是一个与其他列无关的通用解决方案:

cols = df.columns.difference(['Start', 'End'])
grps = df.Start.sub(df.End.shift()).gt(10).cumsum()
gpby = df.groupby(grps)
gpby.agg(dict(Start='min', End='max')).join(gpby[cols].sum())

Start End Value1 Value2
0 1 42 10 50
1 100 162 36 22

关于python - 根据条件合并行 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com