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

如何高效合并Pandas DataFrame:将df2行转为df1的递增Call列

问题描述

给定两个Pandas DataFrame:

import pandas as pd

df1 = pd.DataFrame({'Customer': ['Customer1', 'Customer2', 'Customer3'],
             'Status': [0, 1, 1]})

df1输出:

Customer  Status
0  Customer1       0
1  Customer2       1
2  Customer3       1
df2 = pd.DataFrame({'Customer': ['Customer1', 'Customer1', 'Customer1', 'Customer2', 'Customer2', 'Customer3'],
             'Call': ['01-01', '01-02', '01-03', '02-01', '03-02', '06-01']})

df2输出:

Customer    Call
0  Customer1  01-01
1  Customer1  01-02
2  Customer1  01-03
3  Customer2  02-01
4  Customer2  03-02
5  Customer3  06-01

需要将df2的行转为新增列添加到df1中,最终DataFrame每行对应唯一客户,Call列以Call_1、Call_2这类递增形式命名,不足的用NaN填充,期望结果如下:

Customer  Status Call_1 Call_2 Call_3
0  Customer1       0  01-01  01-02  01-03
1  Customer2       1  02-01  03-02    NaN
2  Customer3       1  06-01    NaN    NaN

尝试过结合stack()和merge()但无法实现,求高效的合并方法。


高效实现方法

可以通过分组编号+透视表+合并的步骤完成,这是处理这类行转列需求的高效方案,具体操作如下:

  1. 给df2的每个客户的Call记录生成递增编号
    使用groupby('Customer').cumcount()为每个客户的Call记录生成从0开始的序号,加1后得到Call_1、Call_2命名所需的数字部分:

    df2['call_num'] = df2.groupby('Customer').cumcount() + 1
    
  2. 将df2透视成宽表
    以Customer为索引,call_num为列名,Call为值完成行转列,再通过add_prefix添加统一前缀:

    df2_pivot = df2.pivot(index='Customer', columns='call_num', values='Call').add_prefix('Call_')
    
  3. 合并到df1
    使用merge按Customer列将df1和透视后的df2合并,保留df1的所有行:

    result = df1.merge(df2_pivot, on='Customer', how='left')
    

完整代码

import pandas as pd

df1 = pd.DataFrame({'Customer': ['Customer1', 'Customer2', 'Customer3'],
             'Status': [0, 1, 1]})

df2 = pd.DataFrame({'Customer': ['Customer1', 'Customer1', 'Customer1', 'Customer2', 'Customer2', 'Customer3'],
             'Call': ['01-01', '01-02', '01-03', '02-01', '03-02', '06-01']})

# 生成Call编号
df2['call_num'] = df2.groupby('Customer').cumcount() + 1
# 透视转宽表
df2_pivot = df2.pivot(index='Customer', columns='call_num', values='Call').add_prefix('Call_')
# 合并
result = df1.merge(df2_pivot, on='Customer', how='left')

print(result)

输出结果与期望完全一致:

Customer  Status Call_1 Call_2 Call_3
0  Customer1       0  01-01  01-02  01-03
1  Customer2       1  02-01  03-02    NaN
2  Customer3       1  06-01    NaN    NaN

方案优势

  • groupby.cumcount()是矢量化操作,效率远高于循环处理
  • pivot是Pandas原生的行转列高效方法,处理大数据量时性能优异
  • 最终的merge基于索引匹配,确保整体流程的高效性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:46:04