我有这张桌子:
id start end stg
0 ZZ 0 25 5.0
1 ZZ 10 65 7.0
2 ZZ 30 50 2.0
3 ZZ 50 60 3.0
4 BB 0 2 5.6
5 BB 5 8 6.6
6 BB 8 13 18.0
如果范围[start,end]中存在重叠并创建新范围和stg,我想在“stg”中添加值.输出应该如下所示:
id start end stg
0 ZZ 0 10 5
1 ZZ 10 25 12
2 ZZ 25 30 7
3 ZZ 30 50 9
4 ZZ 50 60 10
5 ZZ 60 65 7
6 BB 0 5 5.6
7 BB 5 8 6.6
8 BB 8 13 18.0
解决方法:
这只是一个部分解决方案,因为它完全忽略了id.使用IntervalIndex:
示例数据
df = pd.DataFrame({'id': ['ZZ'] * 4,
'start': [0, 10, 30, 50],
'end': [25, 65, 50, 60],
'stg': [5.0, 7.0, 2.0, 3.0]})
df = df[['id', 'start', 'end', 'stg']]
df
id start end stg
0 ZZ 0 25 5.0
1 ZZ 10 65 7.0
2 ZZ 30 50 2.0
3 ZZ 50 60 3.0
获取由起始值和结束值定义的最小子区间
subints = pd.IntervalIndex.from_breaks(sorted(np.unique(df[['start', 'end']].values.flatten())))
subints
IntervalIndex([(0, 10], (10, 25], (25, 30], (30, 50], (50, 60], (60, 65]]
closed='right',
dtype='interval[int64]')
在原始DF上设置IntervalIndex
idx = pd.IntervalIndex.from_arrays(df['start'], df['end'])
df.set_index(idx, inplace=True)
df
id start end stg
(0, 25] ZZ 0 25 5.0
(10, 65] ZZ 10 65 7.0
(30, 50] ZZ 30 50 2.0
(50, 60] ZZ 50 60 3.0
在列表推导中使用IntervalIndex切片
result = pd.DataFrame([(s.left, s.right, df2.loc[s]['stg'].sum())
for s in subints],
columns=['start', 'end', 'stg'])
result
start end stg
0 0 10 5.0
1 10 25 12.0
2 25 30 7.0
3 30 50 9.0
4 50 60 10.0
5 60 65 7.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。