我有两张CSV。一个是关于政治家的捐款:每一行都是捐赠,每一行都有捐赠公司的名称和该公司的联邦注册号(CPF_CNPJ_doador - 该国每家公司都是唯一的)
CPF_CNPJ_doador Nome_doador Valor
73668675000187 CWVGRAFICA EDITORA E BAZAR EIRELI LTDA ME 1000,00
83647909000163 CARBONIFERA CRICIUMA S/A 1750,00
10731057000114 HAROLDO AZEVEDO CONSTRUÇÕES LTDA 100,00
...
其他CSV公司存在环境违规行为。您有几个数据,包括公司名称和该公司的联邦注册号(CPF_CNPJ - 该国家中每家公司都是唯一的)。 但是,公司可能会在此CSV中出现多次 - 例如,可能有多个关联公司存在违规行为
Nome_Razao_Social CPF_CNPJ
Carajas Madeiras Industria e Comercio Ltda - Me 02579504000214
Carbo Gás Ltda 03828695000435
Carbomil Química S/A 07645062000108
Carbomil Química S/A 07645062000108
...
我做了这两个CSV的pandas merge(Python 3):
ibama_doadores = pd.merge(eleitos_d_doadores, ibama, left_on = 'CPF_CNPJ_doador', right_on = 'CPF_CNPJ')
问题是该命令在两个CSV中查找结果匹配,但只要第二个CSV CPF_CNPJ_doador出现多次,它就会重复这些行:
CPF_CNPJ_doador Nome_doador_originario
7645062000108.0 CARBOMIL QUIMICA S A
7645062000108.0 CARBOMIL QUIMICA S A
7645062000108.0 CARBOMIL QUIMICA S A
...
请问,是否有合并类型可以消除重复值?如果重复在第二个数据库中搜索的项目
答案 0 :(得分:1)
我认为一种可能的解决方案是删除两个DataFrame中的重复项:
ibama_doadores = pd.merge(eleitos_d_doadores.drop_duplicates('CPF_CNPJ_doador'),
ibama.drop_duplicates('CPF_CNPJ'),
left_on = 'CPF_CNPJ_doador',
right_on = 'CPF_CNPJ')
或者为计数重复项创建新列并添加此列以进行连接:
eleitos_d_doadores['g'] = eleitos_d_doadores.groupby('CPF_CNPJ_doador').cumcount()
ibama['g'] = ibama.groupby('CPF_CNPJ').cumcount()
ibama_doadores = pd.merge(eleitos_d_doadores,
ibama,
left_on = ['CPF_CNPJ_doador','g'],
right_on = ['CPF_CNPJ','g']).drop('g', 1)
样品:
eleitos_d_doadores = pd.DataFrame({
'CPF_CNPJ_doador': ['a','b','c','c','a'],
'B': list(range(1,6))
})
ibama = pd.DataFrame({
'CPF_CNPJ': ['a','b','a','a','c'],
'C': list(range(5))
})
ibama_doadores = pd.merge(eleitos_d_doadores.drop_duplicates('CPF_CNPJ_doador'),
ibama.drop_duplicates('CPF_CNPJ'),
left_on = 'CPF_CNPJ_doador',
right_on = 'CPF_CNPJ')
print (ibama_doadores)
B CPF_CNPJ_doador C CPF_CNPJ
0 1 a 0 a
1 2 b 1 b
2 3 c 4 c
eleitos_d_doadores['g'] = eleitos_d_doadores.groupby('CPF_CNPJ_doador').cumcount()
ibama['g'] = ibama.groupby('CPF_CNPJ').cumcount()
ibama_doadores = pd.merge(eleitos_d_doadores,
ibama,
left_on = ['CPF_CNPJ_doador','g'],
right_on = ['CPF_CNPJ','g']).drop('g', 1)
print (ibama_doadores)
B CPF_CNPJ_doador C CPF_CNPJ
0 1 a 0 a
1 2 b 1 b
2 3 c 4 c
3 5 a 2 a