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

在两个Pandas DataFrame间分配值:按类别关联生成item列

按类别和数量分配Item生成新DataFrame

实现思路

先给df2每个类别下的Item标记顺序序号,再结合df1每行的数量确定需要提取的Item范围,最后将对应Item拼接成字符串合并到df1中。

具体步骤与代码

  1. 为df2的类别内Item添加顺序索引
    按category分组后,给每个组内的Item分配从1开始的序号,方便后续通过序号范围匹配数量需求:
import pandas as pd

df1 = pd.DataFrame({"category": ["foo", "foo", "bar", "bar", "bar"], "quantity": [1,2,1,2,3]})
df2 = pd.DataFrame({
    "category": ["foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar", "bar", "bar"], 
    "item": ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
})

# 给每个category组内的item添加顺序编号
df2['seq'] = df2.groupby('category').cumcount() + 1
  1. 计算df1类别内的累计数量区间
    按category分组后,计算每行对应的Item序号起始和结束值,明确当前行需要提取的Item范围:
# 计算每个category组内的累计数量,确定每个行的item序号范围
df1['start'] = df1.groupby('category')['quantity'].cumsum() - df1['quantity'] + 1
df1['end'] = df1.groupby('category')['quantity'].cumsum()
  1. 关联表并筛选匹配的Item
    通过category关联两个表,筛选出序号在df1每行区间内的Item,再按df1的行分组拼接Item:
# 关联df1和df2,筛选符合序号范围的item
merged = pd.merge(df1, df2, on='category', how='left')
merged = merged[(merged['seq'] >= merged['start']) & (merged['seq'] <= merged['end'])]

# 按df1的行索引分组,拼接item为逗号分隔的字符串
df3 = merged.groupby(merged.index).agg({
    'category': 'first',
    'quantity': 'first',
    'item': ','.join
}).reset_index(drop=True)
  1. 查看结果
    运行后df3的输出与需求完全一致:
print(df3)
# 输出:
#   category  quantity     item
# 0      foo         1        A
# 1      foo         2      B,C
# 2      bar         1        E
# 3      bar         2      F,G
# 4      bar         3    H,I,J

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:40:56