如何测试字符串包含列表中的元素并通过 Pandas 将目标元素分配给另一列
Posted
技术标签:
【中文标题】如何测试字符串包含列表中的元素并通过 Pandas 将目标元素分配给另一列【英文标题】:How to test string contains elements in list and assign the target element to another column via Pandas 【发布时间】:2019-10-10 05:23:48 【问题描述】:我有一个包含一些公司名称的单列列表。其中一些名称包含国家名称(例如,“China A1”中的“China”,“C1 in Finland”中的“Finland”)。我想根据公司名称和由国家名称组成的预定义列表来提取他们所属的国家/地区。
原始数据框df是这样显示的
Company name Country
0 China A1
1 Australia-A2
2 Belgium_C1
3 C1 in Finland
4 D1 of Greece
5 E2 for Pakistan
目前,我只能想出一个低效的方法。这是我的代码:
country_list = ['China','America','Greece','Pakistan','Finland','Belgium','Japan','British','Australia']
for t in country_list:
df.loc[df['company name'].contains(t),'country']=t
结果显示如下
Company name Country
0 China A1 China
1 Australia-A2 Australia
2 Belgium_C1 Belgium
3 C1 in Finland Finland
4 D1 of Greece Greece
5 E2 for Pakistan Pakistan
我认为当 country_list 包含大量元素时,即国家,通过循环方法会很耗时。有没有更简单的方法来解决我的问题?
【问题讨论】:
【参考方案1】:这是使用str.extract
的一种方式:
df['Country'] = df['Company name'].str.extract('('+'|'.join(country_list)+')')
Company name Country
0 China A1 China
1 Australia-A2 Australia
2 Belgium_C1 Belgium
3 C1 in Finland Finland
4 D1 of Greece Greece
5 E2 for Pakistan Pakistan
【讨论】:
【参考方案2】:你需要series.str.extract()
这里:
pat = r'()'.format('|'.join(country_list))
# pat-->'(China|America|Greece|Pakistan|Finland|Belgium|Japan|British|Australia)'
df['Country']=df['Company name'].str.extract(pat, expand=False)
【讨论】:
【参考方案3】:也许使用findall
,以防您在一个单元格中有多个国家/地区名称
df["Company name"].str.findall('|'.join(country_list)).str[0]
Out[758]:
0 China
1 Australia
2 Belgium
3 Finland
4 Greece
5 Pakistan
Name: Company name, dtype: object
【讨论】:
【参考方案4】:将str.extract
与Regex
一起使用
例如:
import pandas as pd
country_list = ['China','America','Greece','Pakistan','Finland','Belgium','Japan','British','Australia']
df = pd.read_csv(filename)
df["Country"] = df["Company_name"].str.extract("("+"|".join(country_list)+ ")")
print(df)
输出:
Company_name Country
0 China A1 China
1 Australia-A2 Australia
2 Belgium_C1 Belgium
3 C1 in Finland Finland
4 D1 of Greece Greece
5 E2 for Pakistan Pakistan
【讨论】:
以上是关于如何测试字符串包含列表中的元素并通过 Pandas 将目标元素分配给另一列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 FOR 循环中对 Python Pandas 列表中的元素执行字符串更改
循环遍历 pandas 数据框列中的列表元素以在新列中返回列表