如何高效合并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()但无法实现,求高效的合并方法。
高效实现方法
可以通过分组编号+透视表+合并的步骤完成,这是处理这类行转列需求的高效方案,具体操作如下:
给df2的每个客户的Call记录生成递增编号
使用groupby('Customer').cumcount()为每个客户的Call记录生成从0开始的序号,加1后得到Call_1、Call_2命名所需的数字部分:df2['call_num'] = df2.groupby('Customer').cumcount() + 1将df2透视成宽表
以Customer为索引,call_num为列名,Call为值完成行转列,再通过add_prefix添加统一前缀:df2_pivot = df2.pivot(index='Customer', columns='call_num', values='Call').add_prefix('Call_')合并到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
相关产品推荐
相关产品推荐

