使用熊猫通过比较键(“ id”)来组合csv

时间:2019-06-01 20:11:07

标签: python pandas

我有两个内容基本相同的CSV,但是其中的一个拼写错误已消除,fileA.csvfileB.csv从上游(limesurvey安装)进行了更新(如添加了新行) 。如何通过检查“ id”列使用“熊猫”“合并”这两个文件?

我尝试使用Python csv模块遍历两个文件,但未成功结束。我设法使用下面的代码合并了这两个CSV,但它只是添加了以“ _x”和“ _y”结尾的相同列...

import pandas as pd

fileA = pd.read_csv("new_data.csv_corrected",sep=";")
fileB = pd.read_csv("new_data.csv",sep=";")

merged = pd.merge(fileB, fileA, on='id')

print(merged.to_csv())

2 个答案:

答案 0 :(得分:0)

如果要保留df_A的所有行并添加仅出现在df_b中的新行,则可以将它们都合并。然后使用drop_duplicates函数删除df_a中已经存在的所有df_b行。默认情况下drop_duplicates保留第一行,因此df_A的所有已更正的行将被保留。

可能看起来像这样:

df_A = pd.DataFrame({'index': ['row1', 'row2', 'row3', 'row4'], 'value': [1,2,3,4]})
df_B = pd.DataFrame({'index': ['row1', 'row2', 'row3', 'row4', 'row5'], 'value': ['1*','2zert',3,4,5]})

df_c = pd.concat([df_A, df_B])
df_c.drop_duplicates(['name'])

出:

    name    value
0   row1    1
1   row2    2
2   row3    3
3   row4    4
4   row5    5

答案 1 :(得分:0)

我假设从fileA.csv中删除了拼写错误,这意味着您想在fileA.csv中保留行,但是在fileB.csv中添加fileA.csv中不存在的任何行

一般来说,您应该阅读数据框架,以便将 index 设置为主键。完成此操作后,我认为执行所需操作的简单方法是combine_first()


示例:

> cat FileA.csv 
id,0,  1,  2,  3,  4
A,1.000,1.000,1.000,1.000,1.000
B,1.000,1.000,1.000,1.000,1.000
C,1.000,1.000,1.000,1.000,1.000
D,1.000,1.000,1.000,1.000,1.000
> cat FileB.csv 
id,0,  1,  2,  3,  4
A,0.000,0.000,0.000,0.000,0.000
B,0.000,0.000,0.000,0.000,0.000
E,0.000,0.000,0.000,0.000,0.000
F,0.000,0.000,0.000,0.000,0.000
> dfA = pd.read_csv('FileA.csv', header=0, index_col='id') 
> dfB = pd.read_csv('FileB.csv', header=0, index_col='id')
> dfA.combine_first(dfB)

给予:

           0         1         2         3         4
id                                                  
A  +1.000000 +1.000000 +1.000000 +1.000000 +1.000000
B  +1.000000 +1.000000 +1.000000 +1.000000 +1.000000
C  +1.000000 +1.000000 +1.000000 +1.000000 +1.000000
D  +1.000000 +1.000000 +1.000000 +1.000000 +1.000000
E  +0.000000 +0.000000 +0.000000 +0.000000 +0.000000
F  +0.000000 +0.000000 +0.000000 +0.000000 +0.000000

也有DataFrame.update(),但令人讨厌的是,它的行为与dict.update()不一致,因为不会添加新的“键”(索引项)。