2017-10-14 16 views
1

私は2つの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で複数回表示されることがあります - それは私がこれら二つのCSVのパンダマージ(Pythonの3)製の

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 
... 

例えば不規則で複数の関連会社を有していてもよい:

ibama_doadores = pd.merge(eleitos_d_doadores, ibama, left_on = 'CPF_CNPJ_doador', right_on = 'CPF_CNPJ') 

を問題は、コマンドが両方のCSVでの結果の一致を探すということですが、2番目の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

「CPF_CNPJ_doador」または「CPF_CNPJ」が重複しているか、またはその両方に問題があります。 – jezrael

+0

両方ともCSVで複製することができます(政治家は同じ会社から異なる日付に寄付を受けることができます)。 –

+0

しかし、私は、たとえ彼らが重複した会社の行から来ているとしても、寄付のすべての行を得たいと思っています。しかし、彼らは第2のCSVに存在しなければならない –

答えて

1

を繰り返し、私は1つの可能な解決策は、両方のデータフレームで重複を削除だと思う:

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 
+0

ありがとう、2番目のCSV(名前を変更したいくつかの列、内容は同じです)から重複した行だけを削除しました: –

+0

ibama_doadores_orig = pd.merge(eleitos_d_doadores、ibama.drop_duplicates( 'CPF_CNPJ_limpo')、left_on = 'CPF_CNPJ_doador_originario'、right_on = 'CPF_CNPJ_limpo'、how = 'left') –

+0

まだ重複はありませんか? – jezrael

関連する問題