【问题标题】:Find element in pandas dataframe在熊猫数据框中查找元素
【发布时间】:2019-01-26 07:03:27
【问题描述】:

我有一张桌子:

    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)]

你能帮我解决这个问题吗?

【问题讨论】:

  • ABC 正确吗?这不是错字,需要ABS?

标签: python regex pandas dataframe


【解决方案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

然后通过前 3 个值和 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 答案。

【讨论】:

    【解决方案2】:

    如果“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']
    

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2020-07-26
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多