我有一个带有字符串列的数据帧,该列包含一系列作者名称及其从属关系。
地址 |
---|
'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