如何测试字符串包含列表中的元素并通过 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.extractRegex 一起使用

例如:

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 数据框列中的列表元素以在新列中返回列表

如果组中的最后一个元素包含Pandas中的特定字符串,则标记

如何在 Pandas 中连接包含列表(系列)的两列

Python:如何判断列表中的元素是否包含某个数字?