2016-09-26 5 views
0

を用い国名のサブストリングを照合することによって、データフレーム内のCountryCode列のNULL値Iは、2つのデータフレームを有する:更新パイソン

災害:災害、CountryInfo障害は、例えば、いくつかのNULL値を持つ列の国コードを有します:

1.**Country**    - **Country_code** 
2.India     - Null   
3.Afghanistan (the)  - AFD 
4.India     - IND 
5.United States of America - Null 

CountryInfo:

0.**CountryName** - **ISO** 
1.India    - IND 
2.Afganistan  - AFD 
3.United States  - US 

期待される結果

  Country Country_code 
0   India   IND 
1 Afghanistan   AFD 
2   India   IND 
3 United States   US 

国名の部分文字列を参照して国コードを入力する必要があります。誰でもこの解決策を提案できますか?

答えて

0

これはそれを行う必要があります。 renameで列名を変更して、両方ともdataframesが同じ列名を持つようにする必要があります。次に、difflibモジュールとそのget_close_matchesメソッドを使用して、ファジーマッチを行い、Countryの名前を置き換えることができます。そして、それは最も近いものを提供df1Country欄に名前とdf2Country列を変更しますdataframes

import pandas as pd 
import numpy as np 
import difflib 

df1 = pd.DataFrame({'Country' : ['India', 'Afghanistan', 'India', 'United States of America'], 
         'Country_code' : ['Null', 'AFD', 'IND', 'Null']}) 
df1 
        Country Country_code 
0      India   Null 
1    Afghanistan   AFD 
2      India   IND 
3 United States of America   Null 

df2 = pd.DataFrame({'Country' : ['India', 'Afghanistan', 'India', 'United States'], 
        'ISO' : ['IND', 'AFD', 'IND', 'USA']}) 
df2 
      Country ISO 
0   India IND 
1 Afghanistan AFD 
2   India IND 
3 United States USA 

df2.rename(columns={'ISO' : 'Country_code'}, inplace=True) 
df2 
     Country Country_code 
0   India   IND 
1 Afghanistan   AFD 
2   India   IND 
3 United States   USA 

次のコードをマージするだけの簡単な作業です。これは、部分文字列に対して一種の「ファジー結合」を実行する方法です。

df1['Country'] = df1.Country.map(lambda x: difflib.get_close_matches(x, df2.Country)[0]) 
df1 
     Country Country_code 
0   India   Null 
1 Afghanistan   AFD 
2   India   IND 
3 United States   Null 

今することができます単にmergedf1Country_code行が不足して更新しますdataframes、。

df1.merge(df2, how='right', on=['Country', 'Country_code']) 

     Country Country_code 
0 Afghanistan   AFD 
1   India   IND 
2   India   IND 
3 United States   USA 
+0

回答ありがとうございますが、国名は両方のデータフレームで同じではありません。国名と一致するように値の部分文字列を使用する必要があります。例えば、合衆国は、米国の部分文字列を取って米国と合致し、それに応じて国コードを持って来なければならない。 – Bharath

+0

入手しました。 difflibモジュールをインポートして、このコードを実行する必要があります。df2.Country.map(lambda x:difflib.get_close_matches(x、df1.Country)[0])(元の回答を編集しました)これにより、df2とdf1のCountry列との間に最も近い一致が見つけられます。 。その後、データフレームを結合することができます。 – conor

+0

申し訳ありませんが、正しく動作していません。それは 'チュニジア'を 'ロシア'に返し、災害データフレームで私の国名を変更したくないのですが、私は国名 'countryinfo [countryenfo ['ISOen_proper']。str。 contains( "Russia")] 'しかし、それはデータフレーム全体を返し、リンゴはここでデータフレームを渡すことができませんでした。誰かがデータフレーム全体に対してこの機能を実装し、isoコードを災害データフレームにマップする方法を教えて。 – Bharath