【问题标题】:How to put pandas df column values into extract regular expression如何将pandas df列值放入提取正则表达式
【发布时间】:2022-01-12 20:53:19
【问题描述】:

我想知道如何将熊猫数据框列值传递给正则表达式。我已经尝试了以下但得到“TypeError:'Series'对象是可变的,因此它们不能被散列”

我在下面的结果之后。 (我可以使用不同的正则表达式,但想知道如何动态完成)

想法表示赞赏:)

to_search     search_string  search_result
ABC-T3-123    ABC            ABC-T3
ABC-T2-123    ABC            ABC-T3
DEF-T1-123    ABC            DEF-T1

import pandas as pd
  
# create list for data frame
data = [['ABC-T3-123', 'ABC'], ['ABC-T2-123', 'ABC'], ['DEF-T1-123', 'DEF']]
  
# Create the pandas DataFrame
df = pd.DataFrame(data, columns = ['to_search', 'search_string'])

df['search_results']=df['to_search'].str.extract("(" + df['search_string'] + "-T[0-9])")}```

【问题讨论】:

  • 你不能这样做。 :( 相反,.str.extract("(\w+-T[0-9])") 怎么样?即使可以,它也可能会很慢,因为它会为每一行动态生成一个正则表达式。
  • 谢谢 - 但有点通用。希望采用动态方法。

标签: python regex pandas


【解决方案1】:

我知道您想要一个高效的解决方案,但这些 pandas 函数通常不采用 Serieses 之类的值。这是一个基于apply的解决方案,我认为除了简化正则表达式之外,这是这里唯一可行的解​​决方案:

searched = df.apply(lambda row: re.search("(" + row['search_string'] + "-T[0-9])", row['to_search']).group(1), axis=1)

输出:

>>> searched
0    ABC-T3
1    ABC-T2
2    DEF-T1
dtype: object

【讨论】:

  • # create dynamic regex def fn_dynamic_regex_match(row): re_result = re.search("(" + row['search_string'] + "-T[0-9]" ")", row['to_search']) if re_result is None: return None else: return re_result.group(0) df['search_results'] = df.apply(fn_dynamic_regex_match, axis=1)
  • 只是一个更新——我在现实生活中申请时遇到了一个非类型错误——所以添加了一些东西来解决这个问题——见上文。
猜你喜欢
  • 2021-12-04
  • 2017-02-07
  • 2021-10-05
  • 2015-08-31
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多