在df-list中查找,如果所有列表元素都有一个子字符串,则返回Boolean



我有一个带有字符串列的数据帧,该列包含一系列作者名称及其从属关系。

地址
'Smith,Jane(X大学);Doe,Betty(Y研究所)比尔沃特(Z大学);阿尔伯森,约翰(Z大学);陈,希拉里(X大学)注意,乔(X大学);Cal,Stephanie(X大学)

您可以split,但可以expand,因此您可以将stack合并为一个大系列。然后您可以使用extract来获取名称和位置。

那么您的检查是所有值都是'University of X',这可以通过groupby中的相等比较+all来完成。由于分组是基于原始索引的,您可以简单地将结果分配回原始DataFrame

s = (df['Address'].str.split(';', expand=True).stack()
.str.extract('(.*)s((.*))')
.rename(columns={0: 'name', 1: 'location'}))
#                 name         location
#0 0       Smith, Jane  University of X
#  1        Doe, Betty   Institute of Y
#1 0      Walter, Bill     Z University
#  1   Albertson, John     Z University
#  2      Chen, Hilary  University of X
#2 0         Note, Joe  University of X
#  1    Cal, Stephanie  University of X
df['T/F'] = s['location'].eq('University of X').groupby(level=0).all()

print(df)                                                                                                                         
Address    T/F
0  Smith, Jane (University of X); Doe, Betty (Ins...  False
1  Walter, Bill (Z University); Albertson, John (...  False
2  Note, Joe (University of X); Cal, Stephanie (U...   True

您可以使用str.extractall提取括号中的所有大学,并检查是否与University of X匹配。

df['T/F'] = df['Address'].str.extractall(r"(([^)]*))").eq('University of X').groupby(level=0).all()
Address    T/F
0  'Smith, Jane (University of X); Doe, Betty (In...  False
1  'Walter, Bill (Z University); Albertson, John ...  False
2  'Note, Joe (University of X); Cal, Stephanie (...   True

以下是一些其他选项:

u = 'University of X'
df['Address'].str.count(u).eq(df['Address'].str.count(';')+1)

df['Address'].str.findall('([w ]+)(?=))').map(lambda x: set(x) == {u})

输出:

0    False
1    False
2     True

相关内容

最新更新