如何基于条件横向追加数据?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
相关产品推荐
相关产品推荐

