在熊猫数据框中查找元素

时间:2018-08-20 07:24:20

标签: python regex pandas dataframe

我有一张桌子:

    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个字母和相同的长度。

  • 相同的3个字母:ABS
  • 长度:6

我需要从表中获取所有代码。我认为应该是这样的:

t='^[A-Z0-9]{3,10}?$'
for i in df.items():
    l=df[df[i].str.contains(t)]

您能帮我吗?

2 个答案:

答案 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']