Pandas问题:使用pd.concat合并时意外新增一行
嘿,这个问题我之前处理数据的时候也踩过坑!咱们来拆解一下:你说原df删了一行后和两个tfidf的DataFrame都是9999行,但横向合并后却冒出10000行,还有整列的NaN,这大概率是三者的索引没有对齐导致的。
为什么会出现这种情况?
举个例子:假设原df本来是10000行,索引是0~9999,你删除了其中一行(比如索引为5000的行),此时df的索引变成了0~4999, 5001~9999(总共9999行,但索引里缺了5000)。而你的tfidf_desc和tfidf_title如果是基于处理后的df生成的,可能它们的索引是重新生成的连续序列0~9998;或者你是先生成了tfidf再删的df行,那tfidf的索引还是0~9999(但实际只有9999行)。
当你用pd.concat([df, tfidf_desc, tfidf_title], axis=1)时,Pandas会按索引进行对齐合并:如果某个索引值在其中一个DataFrame里存在,另一个里没有,就会自动补NaN,并且保留所有出现过的索引值,最终行数就是所有唯一索引的数量——这就是为什么会多出一行,还出现整列NaN的原因。
快速解决方案
给你两种靠谱的处理方式:
1. 合并前统一重置索引
把三个DataFrame的索引都重置成连续的整数,丢弃原来的索引:
# 重置每个DataFrame的索引,drop=True表示不保留原索引列 df_reset = df.reset_index(drop=True) tfidf_desc_reset = tfidf_desc.reset_index(drop=True) tfidf_title_reset = tfidf_title.reset_index(drop=True) # 再进行合并 merged_df = pd.concat([df_reset, tfidf_desc_reset, tfidf_title_reset], axis=1)
这样三者的索引都是0~9998,合并时就能完美对齐,不会出现多余的行和NaN。
2. 确保生成tfidf时用的是删除行后的df
如果你是先生成了tfidf,然后才删除了df里的一行,那肯定会导致两者的索引/数据不匹配。正确的流程应该是:
# 第一步:先对原df进行筛选,移除不需要的行 df_filtered = df.drop(...) # 你的筛选操作 # 第二步:基于筛选后的df生成tfidf特征 tfidf_desc = generate_tfidf(df_filtered['FullDescription']) # 你的tfidf生成逻辑 tfidf_title = generate_tfidf(df_filtered['Title']) # 第三步:合并,此时三者索引自然对齐 merged_df = pd.concat([df_filtered, tfidf_desc, tfidf_title], axis=1)
验证方法
你可以先打印一下三个DataFrame的索引,看看是不是有差异:
print("df索引:", df.index.values) print("tfidf_desc索引:", tfidf_desc.index.values) print("tfidf_title索引:", tfidf_title.index.values)
对比一下就能发现索引哪里不对啦。
内容的提问来源于stack exchange,提问作者anon_swe

