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

如何基于条件横向追加数据?Pandas宽表合并需求求助

解决方案:将长格式df2横向展开后与宽格式df1合并

我明白你想要实现的效果——把df2中对应同一id的keyword和location数据横向展开成带序号的列(比如keyword1、location1),再和原有的宽表df1合并。之前我也碰到过类似的需求,用pivot结合分组序号就能搞定,咱们一步步来:

1. 先准备示例数据(方便你对照测试)

先模拟你提到的df1和df2结构,这样你可以直接复制代码验证:

import pandas as pd

# 示例宽格式df1
df1 = pd.DataFrame({
    'id': ['A', 'B', 'C'],
    'col1': [10, 20, 30],
    'col2': ['x', 'y', 'z']
})

# 示例长格式df2(同一id可能有多条对应记录)
df2 = pd.DataFrame({
    'id': ['A', 'A', 'B'],
    'keyword': ['python', 'pandas', 'data'],
    'location': ['US', 'CN', 'UK']
})

2. 给df2的每个id分组添加序号

这是关键步骤!要生成keyword1、location1这类带序号的列,得先给每个id下的记录标记顺序:

# 给每个id的记录添加从1开始的序号
df2['seq'] = df2.groupby('id').cumcount() + 1

3. 将df2转成宽格式

用pivot把长格式的df2转成和df1匹配的宽格式,同时处理多级列名:

# 按id和序号转宽格式
df2_wide = df2.pivot(index='id', columns='seq', values=['keyword', 'location'])
# 把多级列名(比如('keyword',1))改成单级的keyword1格式
df2_wide.columns = [f'{col[0]}{col[1]}' for col in df2_wide.columns]
# 重置索引,让id变回普通列(方便后续合并)
df2_wide = df2_wide.reset_index()

4. 合并df1和转换后的df2

最后用merge按id做左连接,保证df1的所有记录都能保留:

# 左连接合并,保留df1的所有id
df3 = pd.merge(df1, df2_wide, on='id', how='left')

最终效果

运行完上面的代码,你会得到这样的df3:

id  col1 col2 keyword1 location1 keyword2 location2
0  A    10    x    python        US    pandas        CN
1  B    20    y      data        UK      NaN       NaN
2  C    30    z      NaN       NaN      NaN       NaN

补充说明

  • 如果df2中同一id有更多记录,会自动生成keyword3、location3这类列,完全适配你的需求;
  • 对于df1中没有对应df2记录的id(比如示例中的C),会用NaN填充,这是合理的默认行为;
  • 你之前尝试的merge直接用的话会变成纵向拼接,而pivot_table如果没加序号的话无法区分同一id的多条记录,这就是之前没成功的原因啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:14:03