我有两个pandas数据帧(实际数据帧要大得多):
events = pd.DataFrame({'Begin':[959.44, 1222.82, 2217.59], 'End':[978.00,1240.41,2799.43]})
markers = pd.DataFrame({'Marker': [0, 256.0, 700, 975.33, 1188.2, 1230.88, 2500, 3120.22]})
我想将事件数据框细分为标记,我正试图像垃圾箱一样对待,即[0,256.0],[256,700]等...试图结束另一行标记数据框,用于说明在该区间内如何观察累积事件总数。每个事件可能最终出现在多个箱中。例如,959.44至978.00事件应该在700-975.33箱中计算15.89(978.00-975.33),其余应计入975.33,1188.2。
我一直在尝试使用pandas.cut来分割标记数据帧,但我不知道如何考虑多个分档。这是最好的方法吗?
答案 0 :(得分:1)
IIUC您可以使用区间索引来获取范围以后使用get loc来获取标记值,即
markers['Begin'] = markers.shift()
nm = markers.sort_index(1).dropna()
nm.index = pd.IntervalIndex.from_arrays(nm['Begin'], nm['Marker'])
events['mark'] = events['Begin'].apply(lambda x : nm.iloc[nm.index.get_loc(x)]['Marker'])
events['new'] = events['mark'] - events['Begin']
输出:
Begin End mark new 0 959.44 978.00 975.33 15.89 1 1222.82 1240.41 1230.88 8.06 2 2217.59 2799.43 2500.00 282.41
<强>解释强>
通过移位Marker
和删除纳米
nm.index = pd.IntervalIndex.from_arrays(nm['Begin'], nm['Marker'])
Begin Marker (0.0, 256.0] 0.00 256.00 (256.0, 700.0] 256.00 700.00 (700.0, 975.33] 700.00 975.33 (975.33, 1188.2] 975.33 1188.20 (1188.2, 1230.88] 1188.20 1230.88 (1230.88, 2500.0] 1230.88 2500.00 (2500.0, 3120.22] 2500.00 3120.22
在区间索引中搜索事件的开始,然后使用get_loc获取索引,获取获得的索引的标记值,即
Begin End mark 0 959.44 978.00 975.33 1 1222.82 1240.41 1230.88 2 2217.59 2799.43 2500.00
稍后从mark
中减去begin
以获取新列
希望它有所帮助。