【问题标题】:Extract country name from text in column to create another column从列中的文本中提取国家名称以创建另一列
【发布时间】:2020-01-22 18:10:27
【问题描述】:

我尝试了不同的组合来从列中提取国家名称,并创建一个仅包含国家的新列。我可以对选定的行执行此操作,即 df.address[9998] 但不能针对整个列。

import pycountry
Cntr = []
for country in pycountry.countries:
    for country.name in df.address:
        Cntr.append(country.name)

你知道这里出了什么问题吗?

编辑:

address 是 df 中的一个对象,

df.address[:10] 看起来像这样

       Address
0    Turin, Italy        
1    NaN                 
2    Zurich, Switzerland 
3    NaN                 
4    Glyfada, Greece     
5    Frosinone, Italy    
6    Dublin, Ireland     
7    NaN                 
8    Turin, Italy        
1    NaN                 
2    Zurich, Switzerland 
3    NaN                 
4    Glyfada, Greece     
5    Frosinone, Italy    
6    Dublin, Ireland     
7    NaN                 
8   ...                  
9    Kristiansand, Norway
Name: address, Length: 10, dtype: object

根据 Petar 在我运行单个查询时的响应,我得到了正确的国家,但是当我尝试创建一个包含所有国家的列(或像 df.address[:5] 这样的范围时,我得到一个空的 Cntr)

    import pycountry
    Cntr = []
    for country in pycountry.countries:
        if country.name in df['address'][1]:
            Cntr.append(country.name)
Cntr
Returns
[Italy]

and df.address[2] returns [ ] 
etc.

我也跑了 df['address'] = df['address'].astype('str')

确保列中没有浮点数或整数。

【问题讨论】:

  • 欢迎来到 StackOverflow。见minimal, reproducible example。在您发布 MRE 代码并准确说明问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您指定的问题。您发布的代码依赖于未定义的数据框,并且您没有证明我们需要解决的问题。不要忘记跟踪您的程序(print 语句是一个好的开始)以检查数据类型和内容。
  • 你能显示df吗,for循环几乎不是解决方案,正则表达式可能更好
  • 变量和函数名称应遵循lower_case_with_underscores 样式。我同意@Kenan,这里可能不需要循环。另外,我真的建议使用 [ ] 进行 DataFrame 列访问,而不是 dot/./attribute 样式。
  • 谢谢大家!我将确保在我的代码中使用正确的命名。我添加了该功能的前 10 行,以便更清晰。如果还有什么我可以补充的,请告诉我。另外,@Kenan 我不知道如何使它与正则表达式一起工作。我试过这个 df['address_new'] = df['address'].astype(str).str.split().str[1],但结果并不好,所以我决定尝试 pycountry...

标签: python dataframe country


【解决方案1】:

示例数据框 df = pd.DataFrame({'address': ['Turin, Italy', np.nan, 'Zurich, Switzerland', np.nan, 'Glyfada, greece']})

df[['city', 'country']] = df['address'].str.split(',', expand=True, n=2)

               address     city       country
0         Turin, Italy    Turin         Italy
1                  NaN      NaN           NaN
2  Zurich, Switzerland   Zurich   Switzerland
3                  NaN      NaN           NaN
4      Glyfada, greece  Glyfada        greece

【讨论】:

  • 我收到此错误“列必须与键长度相同”。我不知道它是否相关,但查看前 100 个值我可以看到我有一些实例,例如“65 Αθηνα”或“91 France”。我认为它可能与“nan”值有关,所以我将它们更改为“None”,但问题仍然存在。我还检查了与此问题相关的其他相关问题,但我还没有发现任何有用的信息。
  • 好的。我认为它像这样df[['city', 'country']] = df['address'].str.split(',', expand=True, n=1) 工作,但我想在这种情况下我会丢失格式为“国家”而不是“城市,国家”的国家
  • 我不认为你会尝试,你总是可以在country 列中使用fillnaaddress
  • 我终于用了这个代码''' df[['city', 'or']] = df['Ror'].str.split(',', expand=True, n= 1) df['or'].fillna('NaN', inplace=True) '''
【解决方案2】:

你真的很亲密。我们不能像这样循环for country.name in df.address。而是:

import pycountry
Cntr = []
for country in pycountry.countries:
    if country.name in df.address:
        Cntr.append(country.name)

如果这不起作用,请提供更多信息,因为我不确定 df.address 的样子。

【讨论】:

  • 谢谢佩塔!我根据您的回答编辑了问题。不幸的是,虽然我可以得到个别国家,但我还不能得到整个专栏的结果
【解决方案3】:

您可以使用库 DataPrep 中的函数 clean_country()。使用pip install dataprep 安装它。

from dataprep.clean import clean_country
df = pd.DataFrame({"address": ["Turin, Italy", np.nan, "Zurich, Switzerland", np.nan, "Glyfada, Greece"]})
df2 = clean_country(df, "address")
df2
               address address_clean
0         Turin, Italy         Italy
1                  NaN           NaN
2  Zurich, Switzerland   Switzerland
3                  NaN           NaN
4      Glyfada, Greece        Greece

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2019-10-12
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多