合并两个无NaN值的DataFrame时出现NaN值问题
问题分析与解决方法
核心原因
join默认按索引对齐数据,你的两个DataFrame虽行数均为1699,但索引不匹配——X_train中有168条记录的索引在label_X_train里不存在,因此合并后这些行的label列自动填充为NaN;内连接仅保留索引匹配的行,所以得到1531条结果(1699-168)。
解决步骤
1. 重置索引后合并(行顺序一一对应时用)
如果两个DataFrame的行是按顺序一一匹配的(即X_train第i行对应label_X_train第i行),直接重置索引后合并即可保留全部1699条记录:
# 重置索引并丢弃原索引 X_train_reset = X_train.reset_index(drop=True) label_X_train_reset = label_X_train.reset_index(drop=True) finalTrain = X_train_reset.join(label_X_train_reset)
也可以用concat更直接:
finalTrain = pd.concat([X_train.reset_index(drop=True), label_X_train.reset_index(drop=True)], axis=1)
2. 定位缺失索引并处理(行顺序不对应时用)
如果行不是按顺序匹配的,先找出X_train中在label_X_train里缺失的索引:
# 找出X_train有但label_X_train没有的索引 missing_index = X_train.index.difference(label_X_train.index) print("缺失的索引:", missing_index)
之后根据业务逻辑填充NaN(示例填充0,可按需调整):
finalTrain = X_train.join(label_X_train) finalTrain = finalTrain.fillna(0)
3. 按位置强制合并(忽略索引)
如果确认两行是按位置一一对应,也可通过添加临时辅助列实现合并:
X_train['temp_id'] = range(len(X_train)) label_X_train['temp_id'] = range(len(label_X_train)) finalTrain = X_train.merge(label_X_train, on='temp_id', how='left').drop('temp_id', axis=1)
内容的提问来源于stack exchange,提问作者Kasturi Kolambkar
相关产品推荐
相关产品推荐

