gpt4 book ai didi

python - 如何基于比较两列中的值来组合 Pandas 数据框中的行?

转载 作者:行者123 更新时间:2023-12-04 09:38:40 24 4
gpt4 key购买 nike

考虑一个 Pandas 数据框,如:

df = pd.DataFrame({'id': ['001', '001', '002', '002', '003', '003', '004', '004', '005', '005'], 
'start': [1, 200, 200, 1, 1, 200, 200, 1, 1, 1000],
'end': [1000, 500, 500, 1000, 500, 1000, 1000, 500, 500, 2000]})
or
id start end
0 001 1 1000
1 001 200 500
2 002 200 500
3 002 1 1000
4 003 1 500
5 003 200 1000
6 004 200 1000
7 004 1 500
8 005 1 500
9 005 1000 2000

我想以一个 Pandas 数据帧结束,这样如果开始和结束对具有给定 id 的行产生重叠,那么它们将被合并。 (这里的索引并不重要。)有没有一种聪明或有效的方法来做到这一点,而无需求助于大量复杂的迭代? (我的实际数据可能有多达数百万行。)

上面例子的最终结果应该是:
   id  start   end
001 1 1000
002 1 1000
003 1 1000
004 1 1000
005 1 500
005 1000 2000

最佳答案

一种可能的方法是按 id 列分组,然后应用函数来合并区间:

import pandas as pd

# Load or create the dataframe df.

def merge_intervals(group):
l = zip(group['start'], group['end'])
merged = []
for i in sorted(l):
if not merged or merged[-1][1] < i[0]:
merged.append(list(i))
else:
merged[-1][1] = max(merged[-1][1], i[1])
start, end = zip(*[(x[0], x[1]) for x in merged])
return pd.DataFrame({
'id': group['id'][0],
'start': start,
'end': end
})

df_new = df.groupby(df['id'], as_index=False).apply(merge_intervals)

在您的示例中,输出如下所示

      id  start   end
0 0 001 1 1000
1 0 002 1 1000
2 0 003 1 1000
3 0 004 1 1000
4 0 005 1 500
1 005 1000 2000

创建了一个 MultiIndex DataFrame,它将具有相同的列。

感谢@scott-boston 注意到错误,感谢@henry-yik 的回答。

关于python - 如何基于比较两列中的值来组合 Pandas 数据框中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62429549/

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