【问题标题】:Distributing value into multiple bins in pandas将价值分配到熊猫中的多个箱子中
【发布时间】:2017-09-24 18:37:08
【问题描述】:

我有两个 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] 等...试图以另一行结束标记数据框,它说明了在该 bin 期间如何观察到事件的累积总数。每个事件都可能最终出现在多个垃圾箱中。例如,959.44 到 978.00 事件应将 15.89 (978.00-975.33) 计入 700-975.33 bin,其余应计入 975.33,1188.2。

我一直在尝试使用 pandas.cut 对标记数据框进行分箱,但我不确定如何处理多个分箱。这是最好的方法吗?

【问题讨论】:

  • 同时添加预期输出。
  • 仅从解释中很难预测输出。如果您给出预期的输出,那就太好了。

标签: python pandas numpy dataframe


【解决方案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']

输出:

开始 结束 标记 新 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 并删除 nan 来创建间隔索引,即

nm.index = pd.IntervalIndex.from_arrays(nm['Begin'], nm['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获取索引,稍后获取所获得索引的标记值,即

开始 结束标记 0 959.44 978.00 975.33 1 1222.82 1240.41 1230.88 2 2217.59 2799.43 2500.00

稍后从begin 中减去mark 以获得新列

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2021-03-12
    相关资源
    最近更新 更多