通过使用python

时间:2016-09-26 15:02:17

标签: python python-2.7 pandas

我有两个数据框: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

我需要参考国家/地区名称的子字符串填写国家/地区代码。任何人都可以为此提出解决方案吗?

1 个答案:

答案 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