我有一张桌子:
Name1 Name2 Name3
0 ABC FGD NNY
1 ABSTRE PC ABSTRE Tree in
2 P ABSTRE NNY
3 JJJ FGD NNY
4 ABSFRE PC ABSKRE
我需要获取以下信息:
['ABSTRE', 'ABSFRE', 'ABSTRE', 'ABSKRE']
所以它意味着代码具有相同的3个字母和相同的长度。
我需要从表中获取所有代码。我认为应该是这样的:
t='^[A-Z0-9]{3,10}?$'
for i in df.items():
l=df[df[i].str.contains(t)]
您能帮我吗?
答案 0 :(得分:1)
我认为需要提取长度为3和6的代码:
print (df)
Name1 Name2 Name3
0 ABS FGD NNY <- changed ABC to ABS
1 ABSTRE PC ABSTRE Tree in
2 P ABSTRE NNY
3 JJJ FGD NNY
4 ABSFRE PC ABSKRE
t1 = '^([A-Z0-9]{3})?$'
t2 = '^([A-Z0-9]{6})?$'
s = df.filter(like='Name').stack()
s1 = s.str.extract(t1, expand=False).dropna()
print (s1)
0 Name1 ABS
Name2 FGD
Name3 NNY
2 Name3 NNY
3 Name1 JJJ
Name2 FGD
Name3 NNY
dtype: object
s2 = s.str.extract(t2, expand=False).dropna()
print (s2)
1 Name1 ABSTRE
2 Name2 ABSTRE
4 Name1 ABSFRE
Name3 ABSKRE
dtype: object
然后通过前三个值和boolean indexing
过滤第二个Series s2
:
L = s2[s2.str[:3].isin(s1)].tolist()
print (L)
['ABSTRE', 'ABSTRE', 'ABSFRE', 'ABSKRE']
如果要检查所有子字符串:
pat = r'\b{}\b'.format('|'.join(s1))
L = s2[s2.str.contains(pat)].tolist()
print (L)
['ABSTRE', 'ABSTRE', 'ABSFRE', 'ABSKRE']
如果要提取所有以ABC
开头且长度为6
的值,请使用extract
:
t = "^(ABS[0-9a-zA-Z]{3})$"
L = df.filter(like='Name').stack().str.extract(t, expand=False).dropna().tolist()
print (L)
['ABSTRE', 'ABSTRE', 'ABSFRE', 'ABSKRE']
或另一个@Shaido答案。
答案 1 :(得分:1)
如果“ ABS”字母始终位于单词的开头,则可以执行以下操作:
df = df.stack()
values = df.loc[df.str.contains("^ABS[0-9a-zA-Z]{3}$")].tolist()
这将匹配所有以“ ABS”开头的长度为6的单词。 print(values)
的结果:
['ABSTRE', 'ABSTRE', 'ABSFRE', 'ABSKRE']