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的最大值。
实现方案
思路
- 对
spc_df按Aisle-Table_no分组,将每行重复Item_time次,同时生成组内连续序号; - 利用
df中的Table_Bit作为组内序号(因为Table_Bit是组内从1开始的连续值); - 通过
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
相关产品推荐
相关产品推荐

