我有两个内容基本相同的CSV,但是其中的一个拼写错误已消除,fileA.csv
和fileB.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())
答案 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()
不一致,因为不会添加新的“键”(索引项)。