【问题标题】:Merge Dataframes on nearest large number在最近的大数上合并数据框
【发布时间】:2021-03-31 01:01:09
【问题描述】:

问题

我有两个数据框;

  1. seller_df,显示在给定价格点有多少产品可供出售
  2. buyer_df,显示有多少市场需求。

我想根据边际数量值(即最接近的最大匹配)将 Seller_df['price'] 列合并到buyer_df

我的尝试

我发现了这个SO Link,它让我很接近。但是它会找到最近的数字匹配,而不是最近的较大数字匹配。

示例

# Seller
seller_df = pd.DataFrame({
    'seller':    ['A',  'B',  'C',  'A',  'B',  'C'],
    'quantity':  [40,   30,   60,   30,   80,   900],
    'price':     [3.33, 3.50, 3.95, 4.25, 4.99, 5.25],
    'cum_avail': [40,   70,   130,  160,  240,  1140]
})

# Buyer
buyer_df = pd.DataFrame({
    'time':              ['t1', 't2', 't3', 't4', 't5', 't6', 't7', 't8', 't9', 't10'],
    'quantity_required': [26,   563,  120,  233,  11,   198,  756,  64,   116,  224]
})

# What I've tried, based on SO link
S = seller_df.assign(key=1)
B = buyer_df.assign(key=1)

merged_SB = pd.merge(S, B, on='key', suffixes=('_S', '_B'))
M = merged_SB.groupby('cum_avail').apply(lambda x: abs(x['cum_avail']-x['quantity_required']) == abs(x['cum_avail']-x['quantity_required']).min())

merged_SB = merged_SB[M.values].drop_duplicates().drop('key', axis=1)

期望的输出

  time  quantity_required  price
0   t1                 26   3.33
1   t2                563   5.25
2   t3                120   3.95
3   t4                233   4.99
4   t5                 11   3.33
5   t6                198   4.99
6   t7                756   5.25
7   t8                 64   3.50
8   t9                116   3.95
9  t10                224   4.99

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    让我们使用pd.merge_asof:

    pd.merge_asof(B.sort_values('quantity_required'), S, 
                  right_on='cum_avail', 
                  left_on='quantity_required', direction='forward' )[['time', 'quantity_required', 'price']]
    

    输出:

      time  quantity_required  price
    0   t5                 11   3.33
    1   t1                 26   3.33
    2   t8                 64   3.50
    3   t9                116   3.95
    4   t3                120   3.95
    5   t6                198   4.99
    6  t10                224   4.99
    7   t4                233   4.99
    8   t2                563   5.25
    9   t7                756   5.25
    

    【讨论】:

    • 嗨,斯科特,谢谢你的款待。非常感谢!
    猜你喜欢
    • 2017-08-26
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2022-01-03
    • 2018-03-21
    • 1970-01-01
    • 2016-12-12
    • 2016-01-30
    相关资源
    最近更新 更多