2017-12-14 8 views
1

パンダを使用したデータのクリーニングに苦労しています。私は、データフレームのZIP、State、Cityの各列(添付)に取り組む必要があります。パンダを使用して列を分割し、他の列の既存の値に追加します。

これは、データを垣間見るです: ジップ列のみジップ番号が含まれている必要があり、状態欄のみ2桁の状態コードを持っている必要があり、市が持っている必要があります:私は直面しています

City   State  ZIP 
0 PEARLAND  TX  77584 
1 HOT SPRINGS AR  7191 
2 PALMDALE  CA  93551 
3 JONESBOROY  AR  72401 
4 WATSONVILLE CA  95076 
5 SACRAMENTO  UCA  95823  
6 AGOURAT  HILLS  CA 91301 
7 JSAN   DIEGO  CA 92114 
8 NEW   PORT  RICHEY FL 34655 
9 BURBANK  CA  91501 

チャレンジ有効な都市名。例えば

City   State  ZIP 
6 AGOURAT  HILLS  CA 91301 
7 JSAN   DIEGO  CA 92114 
8 NEW   PORT  RICHEY FL 34655 

はする必要があります -

City    State  ZIP 
6 AGOURAT HILLS  CA   91301 
7 JSAN DIEGO   CA   92114 
8 NEW PORT RICHEY FL   34655 

だから、誰がどのように私は、この使用してパンダのデータフレームを達成することができます私を助けることができますか?

+0

生の入力とは何ですか?あなたが最初の構文解析で間違いを犯した可能性があり、もう一歩前進することは良いことです。このアドレス解析ライブラリをチェックアウトしてください:https://github.com/datamade/usaddress –

+0

入力として11列のcsvファイルを読んでいます。 RecID、FirstName、MiddleName、LastName、住所、市区町村、州、ZIP、POBox、SSN、DOB。そして、私は上記の3つの列の問題に直面しているこのデータをきれいにするはずです。 –

答えて

1

最良の選択肢は、regexを使用してデータをもう一度読み取ることです。そうでなければ、やり直してください。

df['combined'] = df.apply(' '.join, axis = 1) 
df[['City', 'State', 'Zip']] = df['combined'].str.extract('([A-Z ]+)\s+([A-Z]{2})\s+(\d+)', expand = True) 
df.drop('combined', axis = 1, inplace = True) 



    City   State ZIP 
0 PEARLAND  TX 77584 
1 HOT SPRINGS  AR 7191 
2 PALMDALE  CA 93551 
3 JONESBOROY  AR 72401 
4 WATSONVILLE  CA 95076 
5 NaN    NaN NaN 
6 AGOURAT HILLS CA 91301 
7 JSAN DIEGO  CA 92114 
8 NEW PORT RICHEY FL 34655 
9 BURBANK   CA 91501 
+0

ありがとうございます。私はこれを試してみる。しかし、2文字コードではなく、州名を持つ行はほとんどありません(TXの代わりにTexasなど)。私はそのような行のために何か他のことをする必要があると思う。 –

+0

ええ、それは厄介であり、正しいソリューションはありません。 df.replace({'TEXAS': 'TX'})を使用してすべての州名を2文字コードに置き換えて、私の解決策を試してみてください – Vaishali

関連する問題