Pandas向DataFrame添加行异常:使用append与concat未获得预期结果
解决Pandas合并带表头与无表头DataFrame的问题
看起来你遇到的核心问题是从无表头CSV读取的DataFrame没有和原有DataFrame匹配的列名,直接用append或concat时,因为列名不对应,导致合并结果不符合预期。我来一步步帮你解决:
1. 先复现你的场景
首先模拟你现有的两个DataFrame:
import pandas as pd # 原有带表头的DataFrame df_existing = pd.DataFrame({'ID': [44, 31], 'age': [23, 25]}) print("原有DataFrame:") print(df_existing)
输出:
原有DataFrame: ID age 0 44 23 1 31 25
如果你直接读取无表头CSV而不指定列名,Pandas会自动用0、1作为列名:
# 模拟读取无表头CSV(实际用 pd.read_csv('your_file.csv', header=None)) df_new = pd.DataFrame([[33, 55], [22, 23], [29, 22]]) print("\n无表头读取的有点问题的DataFrame:") print(df_new)
输出:
无表头读取的有点问题的DataFrame: 0 1 0 33 55 1 22 23 2 29 22
这时候直接合并的话,因为列名不匹配,Pandas会保留所有列,结果会出现NaN或者结构混乱,这就是你遇到的情况。
2. 正确的解决方法
方法一:读取CSV时直接指定列名(推荐)
在读取无表头CSV的时候,通过names参数指定和原有DataFrame一致的列名:
# 读取无表头CSV并指定列名 df_new = pd.read_csv('your_file.csv', names=['ID', 'age']) # 使用concat合并(Pandas官方推荐,append已被弃用) combined_df = pd.concat([df_existing, df_new], ignore_index=True) print("\n合并后的最终DataFrame:") print(combined_df)
输出就是你想要的结果:
合并后的最终DataFrame: ID age 0 44 23 1 31 25 2 33 55 3 22 23 4 29 22
方法二:给已读取的无表头DataFrame补列名
如果已经读取了无表头的DataFrame,也可以手动设置列名后再合并:
# 给无表头DataFrame设置列名 df_new.columns = ['ID', 'age'] # 合并(如果坚持用append,注意Pandas 2.0+已弃用该方法) # combined_df = df_existing.append(df_new, ignore_index=True) combined_df = pd.concat([df_existing, df_new], ignore_index=True)
关键提醒
- 合并Pandas DataFrame的核心前提是两个DataFrame的列名完全匹配,否则会出现列错位或NaN值。
append方法在Pandas 2.0及以上版本已经被弃用,官方推荐使用pd.concat()来替代,功能更灵活。
内容的提问来源于stack exchange,提问作者Arwa
相关产品推荐
相关产品推荐

