You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:按Item_time指定次数合并两个DataFrame的需求

问题需求

现有DataFrame df:

Aisle   Table_no    Table_Bit   
11          2           1
11          2           2
11          2           3
11          3           1
11          3           2
11          3           3
14          2           1
14          2           2
14          2           3

另有DataFrame spc_df:

Aisle   Table_no    Item    Item_time   Space
11      2           Mango       2       0.25
11      2           Lemon       1       0.125
11      3           Apple       3       0.75
14      2           Orange      1       0.125
14      2           Melon       2       0.25

需要将spc_df['Item']和spc_df['Space']列按照spc_df['Item_time']指定的次数匹配到df中,最终得到如下预期输出:

Aisle   Table_no    Table_Bit   Item    Space
11          2           1       Mango   0.25        
11          2           2       Mango   0.25                
11          2           3       Lemon   0.125       
11          3           1       Apple   0.75
11          3           2       Apple   0.75
11          3           3       Apple   0.75
14          2           1       Orange  0.125
14          2           2       Melon   0.25
14          2           3       Melon   0.25

补充说明:每组Aisle-Table_no的Item_time之和等于该组Table_Bit的最大值。


实现方案

思路

  1. 对spc_df按Aisle-Table_no分组,将每行重复Item_time次,同时生成组内连续序号;
  2. 利用df中的Table_Bit作为组内序号(因为Table_Bit是组内从1开始的连续值);
  3. 通过Aisle、Table_no和组内序号将两个DataFrame关联,得到匹配结果。

代码实现

import pandas as pd

# 构造示例数据(已有数据可跳过此部分)
df = pd.DataFrame({
    'Aisle': [11,11,11,11,11,11,14,14,14],
    'Table_no': [2,2,2,3,3,3,2,2,2],
    'Table_Bit': [1,2,3,1,2,3,1,2,3]
})

spc_df = pd.DataFrame({
    'Aisle': [11,11,11,14,14],
    'Table_no': [2,2,3,2,2],
    'Item': ['Mango','Lemon','Apple','Orange','Melon'],
    'Item_time': [2,1,3,1,2],
    'Space': [0.25,0.125,0.75,0.125,0.25]
})

# 扩展spc_df并生成组内序号
spc_expand = spc_df.loc[spc_df.index.repeat(spc_df['Item_time'])]
spc_expand['seq'] = spc_expand.groupby(['Aisle', 'Table_no']).cumcount() + 1

# 关联数据并整理结果
result = pd.merge(
    df,
    spc_expand[['Aisle', 'Table_no', 'seq', 'Item', 'Space']],
    left_on=['Aisle', 'Table_no', 'Table_Bit'],
    right_on=['Aisle', 'Table_no', 'seq'],
    how='left'
).drop('seq', axis=1)

print(result)

代码说明

  • spc_df.index.repeat(spc_df['Item_time']):按Item_time指定的次数重复每行数据;
  • groupby(['Aisle', 'Table_no']).cumcount() +1:在每个分组内生成从1开始的连续序号,对应df中的Table_Bit;
  • pd.merge(...):通过分组键和序号将两个DataFrame关联,最终得到符合预期的结果。

内容的提问来源于stack exchange,提问作者user12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:45:42