【问题标题】:Extracting countries from string从字符串中提取国家
【发布时间】:2019-12-19 13:39:36
【问题描述】:

我正在尝试通过 python 3 中的一列数据框。我需要做的是从每一行中获取它所提到的国家和提到该国家的次数。 即如果我有这一行:

['[Aydemir, Deniz', ' Gunduz, Gokhan', ' Asik, Nejla] Bartin Univ, Fac Forestry, Dept Forest Ind Engn, TR-74100 Bartin, Turkey', ' [Wang, Alice] Lulea Univ Technol, Wood Technol, Skelleftea, Sweden']

需要输出一个列表:['Turkey', 'Sweden']

如果我有这一行:

['[Fang, Qun', ' Cui, Hui-Wang] Zhejiang A&F Univ, Sch Engn, Linan 311300, Peoples R China', ' [Du, Guan-Ben] Southwest Forestry Univ, Kunming 650224, Yunnan, Peoples R China']

输出应该是:['China', 'China']。

我已经编写了这段代码,但它没有按我的意愿工作:

from geotext import GeoText
sentence = df.iloc[0,0]
places = GeoText(sentence)
print(places.countries)

它只打印一次国家/地区,在某些情况下,当它是 USA 时,它无法识别缩写。你能帮我弄清楚该怎么做吗?

l = [['[Aydemir, Deniz\', \' Gunduz, Gokhan\', \' Asik, Nejla] Bartin Univ, Fac Forestry, Dept Forest Ind Engn, TR-74100 Bartin, Turkey\', \' [Wang, Alice] Lulea Univ Technol, Wood Technol, Skelleftea, Sweden',1990],
 ['[Fang, Qun\', \' Cui, Hui-Wang] Zhejiang A&F Univ, Sch Engn, Linan 311300, Peoples R China\', \' [Du, Guan-Ben] Southwest Forestry Univ, Kunming 650224, Yunnan, Peoples R China',2005],
 ['[Blumentritt, Melanie\', \' Gardner, Douglas J.\', \' Shaler, Stephen M.] Univ Maine, Sch Resources, Orono, ME USA\', \' [Cole, Barbara J. W.] Univ Maine, Dept Chem, Orono, ME 04469 USA',2012]]
dataf = pd.DataFrame(l, columns = ['Authors', 'Year'])

我尝试执行此代码,但我遇到了同样的问题,它并没有为所有县提供每行一个:

def find_country(n):
    for c in pycountry.countries:
        if str(c.name).lower() in n.lower():
            return c.name
country1 = (dataf['Authors']
  .replace(r"\bUSA\b", "United States", regex=True)
  .apply(lambda x: find_country(x)))

【问题讨论】:

  • 请显示实际数据框

标签: python-3.x pandas gis geopandas


【解决方案1】:

geotext 似乎没有正确检测到美国 - 值得尝试对该软件包提出问题。作为一种解决方法,我将 USA 替换为正确检测到的 United States。

df = (dataf['Authors']
      .replace(r"\bUSA\b", "United States", regex=True)
      .apply(lambda x: geotext.GeoText(x).countries)
)

我不确定您之前在做什么,但这将获得 Author 中每一行的国家/地区列表,包括重复项。

0                  [Turkey, Sweden]
1                    [China, China]
2    [United States, United States]
Name: Authors, dtype: object

正如评论中提到的,如果你想要一个实际的列表列表,只需在末尾添加tolist()。

df.tolist()

[['Turkey', 'Sweden'], ['China', 'China'], ['United States', 'United States']]

【讨论】:

  • 我非常喜欢这个解决方案。但是我怎样才能把这段代码变成每行的列表:[[Turkey, Sweden],[China, China],[United States, United States]]?
  • result_dataframe = dataf['Authors'].replace... result_list = result_dataframe.values.tolist()
  • @mandella 我已经更新了如何转换为列表列表。
  • 谢谢@jberrio
  • 您是否知道其他比geotext 更好的软件包?它不识别英格兰、北爱尔兰、威尔士,可能还有更多,当它们全部用大写或小写字母书写时,它不起作用。我一直在寻找解决方案,但找不到任何解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2016-11-07
  • 2018-07-14
相关资源
最近更新 更多