我有两个数据框:Disaster,CountryInfo Disaster有一个列国家/地区代码,其中包含一些空值,例如:
灾难:
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 :(得分:0)
这应该这样做。您需要使用rename
更改列名,以便dataframes
具有相同的列名。然后,difflib
模块及其get_close_matches
方法可用于进行模糊匹配并替换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
以下代码将更改Country
中的df2
列,其中Country
列中的df1
列中的名称提供最接近的匹配。这是一种在子串上执行一种“模糊连接”的方法。
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
dataframes
即可更新Country_code
中缺少的df1
行。
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