如何统一列名以使用pandas追加拼接多个DataFrame
实现代码
你可以通过以下代码实现需求,适配pandas所有主流版本:
import pandas as pd # 原始DataFrame定义 df1 = pd.DataFrame({'person_id': [101,101,101,101,202,202,202], 'person_type':['A','A','B','C','D','B','A'], 'test_id':[1,2,3,3,4,4,5], 'login_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM']}) df2 = pd.DataFrame({'subject_id': [101,101,101,101,202,202,202], 'test_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM']}) # 1. 修改df2现有列的列名,匹配df1对应字段 df2.rename(columns={'subject_id':'person_id', 'test_date':'login_date'}, inplace=True) # 2. 补充df1存在但df2缺失的字段,填充为空值 for col in df1.columns: if col not in df2.columns: df2[col] = pd.NA # 3. 调整df2列顺序和df1完全一致 df2 = df2.reindex(columns=df1.columns) # 4. 合并两个DataFrame,重置行号避免索引重复 final_df = pd.concat([df1, df2], ignore_index=True)
说明
- 你原有代码存在冗余操作:第一次
rename已经完成了df2现有列的列名修改,第二次mapping映射属于重复操作,可以直接删除。 - 旧版本pandas的
append方法已经在2.0+版本正式弃用,使用pd.concat兼容性更强。 - 用
reindex调整列顺序比直接索引取值更安全,不会因为列名拼写错误抛出异常。
执行完成后final_df的结构完全符合预期:前7行是df1的原始数据,后7行是df2的数据,person_type和test_id两列为空值。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

