Python:合并DataFrame两列并复制对应ID列单元格的方法
解决DataFrame合并列并复制ID的问题
问题场景
现有一个包含ID、col1、col2三列的DataFrame:
ID col1 col2 0 item_1 abc NaN 1 item_2 bcd NaN 2 item_3 NaN NaN 3 item_4 mnb lkj需将col1和col2合并为新的col1列,同时复制对应ID列单元格,得到如下结果:
ID col1 item_1 abc item_2 bcd item_3 NaN item_4 mnb item_4 lkj注:ID为普通列而非索引,尝试过
stack().reset_index()方法但不符合需求,求可行方案。
解决方案
我来帮你搞定这个问题!用pandas的melt函数就能完美解决,这个方法专门用于宽表转长表,比stack更贴合你的需求——它能直接保留ID作为普通列,不用折腾索引。具体步骤如下:
- 构造测试数据(可选,用于验证)
import pandas as pd df = pd.DataFrame({ 'ID': ['item_1', 'item_2', 'item_3', 'item_4'], 'col1': ['abc', 'bcd', pd.NA, 'mnb'], 'col2': [pd.NA, pd.NA, pd.NA, 'lkj'] })
- 使用melt转换列
# 转换宽表为长表,保留ID列,合并col1和col2为新的col1 result = df.melt( id_vars='ID', # 指定要保留的核心列 value_vars=['col1', 'col2'], # 指定需要合并的目标列 value_name='col1' # 给合并后的列设置名称 ).drop(columns='variable') # 删除自动生成的原列名标记列,这个是我们不需要的
- 处理重复的NaN行
原数据中item_3的col1和col2都是NaN,转换后会生成两行重复的记录,我们用drop_duplicates去重,只保留一行即可:
result = result.drop_duplicates(subset=['ID', 'col1'], keep='first')
- 重置索引(可选)
如果需要让结果的索引从0开始连续编号,可以加上这一步:
result = result.reset_index(drop=True)
最终结果
执行完上述代码后,输出的result就是你想要的格式:
ID col1 0 item_1 abc 1 item_2 bcd 2 item_3 <NA> 3 item_4 mnb 4 item_4 lkj
内容的提问来源于stack exchange,提问作者plnnvkv
相关产品推荐
相关产品推荐

