これはそれを行う必要があります。 rename
で列名を変更して、両方ともdataframes
が同じ列名を持つようにする必要があります。次に、difflib
モジュールとそのget_close_matches
メソッドを使用して、ファジーマッチを行い、Country
の名前を置き換えることができます。そして、それは最も近いものを提供df1
にCountry
欄に名前とdf2
にCountry
列を変更します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
今することができます単にmerge
df1
でCountry_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
回答ありがとうございますが、国名は両方のデータフレームで同じではありません。国名と一致するように値の部分文字列を使用する必要があります。例えば、合衆国は、米国の部分文字列を取って米国と合致し、それに応じて国コードを持って来なければならない。 – Bharath
入手しました。 difflibモジュールをインポートして、このコードを実行する必要があります。df2.Country.map(lambda x:difflib.get_close_matches(x、df1.Country)[0])(元の回答を編集しました)これにより、df2とdf1のCountry列との間に最も近い一致が見つけられます。 。その後、データフレームを結合することができます。 – conor
申し訳ありませんが、正しく動作していません。それは 'チュニジア'を 'ロシア'に返し、災害データフレームで私の国名を変更したくないのですが、私は国名 'countryinfo [countryenfo ['ISOen_proper']。str。 contains( "Russia")] 'しかし、それはデータフレーム全体を返し、リンゴはここでデータフレームを渡すことができませんでした。誰かがデータフレーム全体に対してこの機能を実装し、isoコードを災害データフレームにマップする方法を教えて。 – Bharath