【问题标题】:Check a word in a list and create a new variable检查列表中的一个单词并创建一个新变量
【发布时间】:2021-12-22 14:24:40
【问题描述】:

我想使用列表中的城市列表获取 obras desc 内的位置。

我有以下数据框

obras = pd.DataFrame([['1','Agua de Buenos Aires'],['2', 'Sistenas de carreteras Jujuy'],['3','Reasentamiento en Entre Ríos'], ['4','Rutas en Córdoba']],
columns = ['id', 'desc'])

还有名单

list = ['Buenos Aires', 'Jujuy', Corrientes', 'Entre Ríos']

我尝试这样做

for s in obras["desc"]:if any(xs in s for xs in list):obras['Localidad'] = s 

预期的结果是:

id desc localidad
1 Agua de Buenos Aires Buenos Aires
2 Sistenas de carreteras Jujuy
3 Reasentamiento en Entre Ríos Entre Ríos
4 Rutas en Córdoba NaN

但我得到的结果是:

id desc localidad
1 Agua de Buenos Aires Reasentamiento en Entre Ríos
2 Sistenas de carreteras Reasentamiento en Entre Ríos
3 Reasentamiento en Entre Ríos Reasentamiento en Entre Ríos
4 Rutas en Córdoba Reasentamiento en Entre Ríos

我该如何解决这个问题?

谢谢!!!

【问题讨论】:

  • NaN 是从哪里来的?
  • 列表中没有科尔多瓦

标签: python python-3.x string list dataframe


【解决方案1】:

您可以使用apply检查字符串中是否存在列表项:

import pandas as pd

obras = pd.DataFrame([['1','Agua de Buenos Aires'],['2', 'Sistenas de carreteras Jujuy'],['3','Reasentamiento en Entre Ríos'], ['4','Rutas en Córdoba']],columns = ['id', 'desc'])

list_ = ['Buenos Aires', 'Jujuy', 'Corrientes', 'Entre Ríos']
obras['localidad'] = obras['desc'].apply(lambda x: next(iter([i for i in list_ if i in x]), None))

请注意 - 给定所需的输出 - 这只会在多个匹配的情况下返回第一个匹配。

id desc localidad
0 1 Agua de Buenos Aires Buenos Aires
1 2 Sistenas de carreteras Jujuy Jujuy
2 3 Reasentamiento en Entre Ríos Entre Ríos
3 4 Rutas en Córdoba

PS。不要使用list作为变量名,因为它也是一个内置的python函数。

【讨论】:

  • 谢谢它真的有效!请问一下next和iter是怎么工作的?
  • 当然,它将列表转换为迭代器,next() 返回列表中的下一个(在本例中为第一个)项目,除非没有,否则返回 None。如果没有匹配项(即当列表为空时),分配 None 只是一个调整。
  • 谢谢你!!!!!!
猜你喜欢
  • 2019-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多