如何消除熊猫中的重复值?

时间:2017-10-14 19:22:48

标签: python pandas

我有两张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
...

请问,是否有合并类型可以消除重复值?如果重复在第二个数据库中搜索的项目

1 个答案:

答案 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