2016-03-24 10 views
1

英国の郵便番号データを含む変数を含む大きなデータフレーム(DF1)があります。必然的にデータにはいくつかのタイプミスがあります。ただし、正規表現を使用した後、郵便番号データの訂正版(ただし、元の郵便番号が間違っていた行のみ)を含む2番目のデータベースを作成しました.DF2。 (NBインデックス値は必ずしも連続していない。)1つのデータフレームの値をPythonの2番目のデータフレームの値に置き換えます。

id postcode      remark 
0 1  L93AP      Normal 
2 2  LD38AH      Normal 
4 3 SO224ER      Normal 
6 4  SO21     Too short 
8 5 DN379HJ      Normal 
10 6  M21ORH Zero replaced with O (oh) 
12 7  NP745G   S replaced with 5 
14 8 SE136R2   Z replaced with 2 
16 9 BN251ESBN     Too long 
18 10 TD152EH      Normal 

訂正されたデータを含むデータフレームは、次のとおりです。

 0 1 2 3 pcCorrected 
10 M21 0 R H  M210RH 
12 NP7 4 S G  NP74SG 
14 SE13 6 R Z  SE136RZ 

私は2つのデータベースを組み合わせたいようpcCorrected列に新しい値のDF2はDF1データフレームの古いポストコード値を置き換えますが、他のセルの場合、既存のポストコード値はそのまま維持されます。最終的なデータベースは次のようになります。

id postcode      remark 
0 1  L93AP      Normal 
2 2  LD38AH      Normal 
4 3 SO224ER      Normal 
6 4  SO21     Too short 
8 5 DN379HJ      Normal 
10 6  M210RH      Normal 
12 7  NP74SG      Normal 
14 8 SE136RZ      Normal 
16 9 BN251ESBN     Too long 
18 10 TD152EH      Normal 

データベースは非常に大きく(100万行以上)ます。この行動には名前があり、これを行う最も効率的な方法は何ですか?

答えて

2

あなたは、indexesによってmergeを試してみてくださいnotnullによってmaskを作成し、locで新しい値を追加することができます。

df = pd.merge(df1, df2, left_index=True, right_index=True, how='left') 
mask = pd.notnull(df['pcCorrected']) 
print mask 
0  False 
2  False 
4  False 
6  False 
8  False 
10  True 
12  True 
14  True 
16 False 
18 False 
Name: pcCorrected, dtype: bool 

df.loc[mask, 'remark'] = 'Normal' 
df.loc[mask, 'postcode'] = df['pcCorrected'] 

print df[['id','postcode','remark']] 
    id postcode  remark 
0 1  L93AP  Normal 
2 2  LD38AH  Normal 
4 3 SO224ER  Normal 
6 4  SO21 Too short 
8 5 DN379HJ  Normal 
10 6  M210RH  Normal 
12 7  NP74SG  Normal 
14 8 SE136RZ  Normal 
16 9 BN251ESBN Too long 
18 10 TD152EH  Normal 
+0

この回答を最初に読むと、データフレームが変更された場合、マスクに基づいてあるdfから別のdfに列を追加すると、 。しかし、再読みすると、私はこのソリューションがはるかに微妙で安全であることがわかります。単一のdfにマージし、その新しく作成されたdf内の列を操作することは、それらの懸念事項すべてに支払われました。要するに、私はこの答えが本当に好きです。どうもありがとう。 – user1718097

+0

メモリ管理の観点からは、DF2をDF1にマージする方が良いでしょうか? DF1 = DF1.merge(DF2、left_index = True、right_index = True、how = 'left')を使用して、別の新しい(そして大)データフレームを作成するのではなく、 – user1718097

+0

既存の 'DF2'を使う方が良いと思います。最高のテストです。 – jezrael

0

一つの方法は、補正された値を含むデータフレームの各行をステップ実行して、元のデータフレームを転送することである。

for i in DF2.index: 
    DF1.ix[i,'postcode'] = DF2.ix[i,'pcCorrected'] 

これを行うには、より効率的な方法はありますか?

0

多分簡単な方法は、次のようになります。

マスク= df1.index.isin(DF2。インデックス)

df1.loc [マスク、 '郵便番号'] = DF2 [ 'pcCorrected']

これにより、2つのデータフレームをマージする追加のステップを避けることができます

関連する問題