Pandas不使用regex函数



感谢您的阅读和(希望)帮助!我被熊猫申请难住了。我在一个正则表达式函数上使用它,它在普通字符串上工作得很好,但是当我在数据框上使用它时,它只输出相同的单元格值。下面是函数:

def match_pattern(df_cell): 
if type(df_cell) == str:
result = re.search(r'(?:[0-9]{1,4}s)(.*)(?=nName)', df_cell)
if result:
print('result.group(1)',result.group(1))
return result.group(1)
else:
print('no result')
return df_cell
else:
return df_cell

现在这在字符串上工作得很好。例如:

string = '3971 Small Arms SurveynName'
string2 = 'nothing here'
match_pattern(string) # outputs 'Small Arms Survey' which is what i want
match_pattern(string2) # outputs 'nothing here'

,但当我在数据框架上使用apply

时,似乎不起作用
frame = pd.DataFrame(['3971 Small Arms SurveynName'])
frame2 = frame.apply(lambda x: match_pattern(str(x)))
frame2 # outputs '3971 Small Arms SurveynName'

我会尝试其他东西,如迭代行或itertuples等,但最终这个regex函数应该用于大型数据帧的每个单元格,任何比apply慢的东西都是不可行的。

match_pattern()函数中的print语句仅用于调试。如果您想知道,print('result.group(1)',result.group(1))字符串在两个应用程序中都被触发:'string'上的应用程序和数据框架上的应用程序。然而,打印输出是不一样的。在这两种情况下,打印输出都是函数返回的内容,在数据帧的情况下,它只是数据帧中开始的字符串,而对于字符串,打印输出是我想要过滤的字符串(即函数内部正则表达式中的group(1))。

非常感谢Wiktor Stribiżew,他的评论回答了我的问题!事实证明,这是一个简单而愚蠢的错误。在数据框架的列上使用apply就可以了:
frame = frame[0].apply(match_pattern) # outputs 'Small Arms Survey' for the cell, which is what i want

可以在0列上运行apply:

import re
import pandas as pd
def match_pattern(df_cell): 
if isinstance(df_cell, str):
result = re.search(r'[0-9]{1,4}s(.*)nName', df_cell)
if result:
print('result.group(1)',result.group(1))
return result.group(1)
else:
print('no result')
return df_cell
else:
return df_cell
frame = pd.DataFrame(['3971 Small Arms SurveynName'])
frame[0] = frame[0].apply(match_pattern)
# => frame
#                    0
# 0  Small Arms Survey

注意,我将正则表达式简化为[0-9]{1,4}s(.*)nName,因为您所需要的只是捕获到第1组的文本。

此外,if isinstance(df_cell, str):IMHO看起来更整洁,以检查df_cell的类型。

最新更新