2016-09-30 6 views
2

これは私の最初のパンダの試行で、何が問題なのか疑問に思っていました。私はそれぞれ約30.000行の2つのデータフレームを比較しようとしています。私の最初の直感は、両方のデータフレームを繰り返し処理するようになったので、df1のすべてのエントリについて、df2のすべての行を繰り返して、そこにあるかどうかを確認します。エラーメッセージなしでパンダのデータフレームの比較がハングアップ

多分、必要ではないかもしれないし、より簡単な選択肢があります。ここに私がしたことがあります。

$1 & UP STORE CORP.142A | N FRANKLIN ST | 409 408 | 31/07/2014 
$1 store | 110 n martin ave | 408 | 07/01/2015 
0713, LLC | 1412 N. County Road West | 405 408 413 | 16/07/2015 
1 2 3 MONEY EXCHANGE LLC | 588 N MAIN ST | 405 409 408 | 22/05/2015 


$1 store premium | 110 n martin ave | 408 | 07/01/2015 
0713, LLC | 1412 N. County Road West | 405 408 413 | 16/07/2015 
1 2 3 MONEY EXCHANGE LLC | 588 N MAIN ST | 405 409 408 | 22/05/2015 
1145 Parsons Inc | 1145 Parsons Ave | 405 408 | 19/11/2013 

所望の出力があることである:問題が...それは単にエラーメッセージを出力せずにハングアップが、私はそれがハング作っているものを識別することはできません、各データフレームのための

import pandas as pd 


dfOld = pd.read_excel("oldfile.xlsx", header=0) 
dfNew = pd.read_excel("newfile.xlsx", header=0) 
columns = ["NAME","ADDRESS","STATUS","DATE"] 
result = pd.DataFrame(columns=columns) 

for index, rowOld in dfOld.iterrows(): 

    for index, rowNew in dfNew.iterrows(): 

     if rowOld.all() != rowNew.all(): 
      result.loc[len(result)] = rowOld.all() 


writer = pd.ExcelWriter('Deletions.xlsx', engine='xlsxwriter') 
result.to_excel(writer, sheet_name='Deleted') 
writer.save() 

サンプル・データであり、データフレームresultsには、dfNewに存在しないdfOldの行が入力されます。だから、新しいresultsデータフレームは、で構成されます:

$1 & UP STORE CORP.142A | N FRANKLIN ST | 409 408 | 31/07/2014 
$1 store | 110 n martin ave | 408 | 07/01/2015 
問題は、それが小さなサンプルで動作することができれば、それは、そうであっても、大量(データフレームあたり30.000エントリ)で動作していないということです

Iこれが多くのエントリーを進める方法であるかどうか疑問に思います。

+0

あなたは(各DFのための5,6行のデータのサンプルを追加できます)と望ましい出力? – jezrael

+0

ありがとうございました。希望の出力が得られれば、簡単に確認できます。 – jezrael

+0

また、私はあなたの解決策を試して、それが正常に動作するか間違っているかをサンプルで確認しています – jezrael

答えて

2

あなたはパラメータindicator=Truemergeを使用して、boolean indexingによってフィルタリングすることができます:

df = pd.merge(dfOld, dfNew, how='outer', indicator=True) 
print (df) 
         NAME     ADDRESS  STATUS \ 
0 $1 & UP STORE CORP.142A    N FRANKLIN ST  409 408 
1     $1 store   110 n martin ave   408 
2     0713, LLC 1412 N. County Road West 405 408 413 
3 1 2 3 MONEY EXCHANGE LLC    588 N MAIN ST 405 409 408 
4   $1 store premium   110 n martin ave   408 
5   1145 Parsons Inc   1145 Parsons Ave  405 408 

     DATE  _merge 
0 31/07/2014 left_only 
1 07/01/2015 left_only 
2 16/07/2015  both 
3 22/05/2015  both 
4 07/01/2015 right_only 
5 19/11/2013 right_only 

print (df[df._merge == 'left_only']) 
         NAME   ADDRESS STATUS  DATE  _merge 
0 $1 & UP STORE CORP.142A  N FRANKLIN ST 409 408 31/07/2014 left_only 
1     $1 store 110 n martin ave  408 07/01/2015 left_only 

最終削除ヘルパー列_merge

print (df[df._merge == 'left_only'].drop('_merge', axis=1)) 
         NAME   ADDRESS STATUS  DATE 
0 $1 & UP STORE CORP.142A  N FRANKLIN ST 409 408 31/07/2014 
1     $1 store 110 n martin ave  408 07/01/2015 
+0

ありがとうございました。これは実際に私が望んでいた効果があり、私の方法とは異なり、ぶら下がっていない状態で走った。 –

+0

Dladがお手伝いをすることができます!受け入れてくれてありがとう! – jezrael

関連する問題