如何使用Python Pandas合并含共同item_id列的CSV文件并获取指定列
如何正确合并具有共同主键的CSV文件?
你遇到的问题很典型——pd.concat()是纵向堆叠数据(把两个表上下拼在一起),而你需要的是基于共同主键(item_id)横向合并,把不同表中同一item的信息整合到一行里。这也是为什么concat后会出现重复的item_id和NaN值:堆叠后同一item会出现两次,且每个表独有的列在另一表的行里显示为NaN。
解决方案:使用pd.merge()替代pd.concat()
pd.merge()是pandas中专门用于按主键合并表格的方法,正好匹配你的需求。下面是修改后的完整代码,能得到你期望的结果:
import pandas as pd # 生成测试数据(这部分和你的代码一致) item_id = [1342, 35513, 5135, 5351] weight = [10, 20, 30, 40] location = ['A', 'B', 'B', 'A'] fcsv = {'id': item_id, 'loc': location, 'weight': weight} fcsv_df = pd.DataFrame(fcsv) item_id = [35513, 1342, 5135, 5351] weight = [20, 10, 30, 40] price = [10555, 25550, 35550, 4550] fcsv2 = {'id': item_id, 'weight': weight, 'price': price} fcsv2_df = pd.DataFrame(fcsv2) # 核心:用merge按id合并两个表 merged_df = pd.merge(fcsv_df, fcsv2_df, on='id', how='inner') # 处理重复的weight列(两个表都有weight,merge后会自动加_x/_y后缀) # 因为你的测试数据中weight值一致,我们保留其中一个并重命名 merged_df = merged_df.drop(columns='weight_y') merged_df = merged_df.rename(columns={'weight_x': 'weight', 'loc': 'location'}) # 调整列顺序到你期望的格式 merged_df = merged_df[['id', 'weight', 'location', 'price']] # 输出结果 print(merged_df)
代码解释
pd.merge()参数说明:on='id':指定按id列(对应你的item_id)作为匹配主键how='inner':只保留两个表中都存在的id(你的测试数据所有id都匹配,用outer也可以,但inner更严谨)
- 处理重复列:因为两个表都有
weight列,merge后会生成weight_x(来自第一个表)和weight_y(来自第二个表),这里测试数据值一致,所以删除其中一个并重命名为weight。如果实际场景中weight值不同,你可以根据需求选择保留某一个,或者做聚合(比如取平均值)。 - 调整列顺序:把列调整为你想要的
id、weight、location、price顺序。
最终输出结果
运行代码后会得到你期望的数据集:
id weight location price 0 1342 10 A 25550 1 35513 20 B 10555 2 5135 30 B 35550 3 5351 40 A 4550
额外提示
如果你的实际CSV文件数量更多(不止2个),可以先把所有CSV文件读入DataFrame列表,然后用reduce函数循环merge:
from functools import reduce # 假设你有多个CSV文件路径 csv_files = ['csv1.csv', 'csv2.csv', 'csv3.csv'] df_list = [pd.read_csv(file) for file in csv_files] # 循环合并所有DataFrame final_df = reduce(lambda left, right: pd.merge(left, right, on='id', how='inner'), df_list)
内容的提问来源于stack exchange,提问作者ADUNAC
相关产品推荐
相关产品推荐

