将值分配到大熊猫的多个箱子中

时间:2017-09-24 09:00:31

标签: python pandas numpy dataframe

我有两个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来分割标记数据帧,但我不知道如何考虑多个分档。这是最好的方法吗?

1 个答案:

答案 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以获取新列

希望它有所帮助。