使用pd.concat(axis=1)合并数据集后右侧出现NaN的解决方法
问题根源
使用pd.concat([df1, df2], axis=1)横向合并时,Pandas默认按**索引(index)**对齐数据。即使合并前两个数据集无缺失值,只要索引不匹配(比如索引值不一致、行数不同),就会导致其中一侧出现NaN——因为Pandas会为找不到对应索引的行填充缺失值。
解决方法
1. 先检查索引与行数
先确认两个数据集的索引和行数是否匹配:
# 查看索引 print(df1.index) print(df2.index) # 查看行数 print(len(df1), len(df2))
2. 重置索引后合并(按行位置对齐)
如果原索引无业务意义,直接重置索引再合并,确保按行的物理位置对齐:
df1_reset = df1.reset_index(drop=True) df2_reset = df2.reset_index(drop=True) df_both = pd.concat([df1_reset, df2_reset], axis=1)
也可以直接在concat中添加ignore_index=True参数(会重置合并后的列索引):
df_both = pd.concat([df1, df2], axis=1, ignore_index=True)
⚠️ 注意:此方法要求两个数据集行数完全一致,否则行数少的一侧仍会被补NaN。
3. 按业务主键合并(更精准)
如果两个数据集有共同的业务标识列(如user_id、order_no),建议用pd.merge替代concat,按主键精准对齐:
# 按共同主键id做内连接(只保留两边都有的记录) df_both = pd.merge(df1, df2, on='id', how='inner') # 若要保留df1的所有记录,用左连接 # df_both = pd.merge(df1, df2, on='id', how='left')
4. 处理行数不一致的情况
如果两个数据集行数不同,先排查原因:是否有数据筛选、遗漏?若确认数据完整,可根据业务需求选择:
- 截断行数多的数据集,与少的保持一致:
df1 = df1.iloc[:len(df2)] - 为行数少的数据集补全缺失行(需根据业务逻辑填充默认值)
内容的提问来源于stack exchange,提问作者Cairo Alcantara
相关产品推荐
相关产品推荐

