Pandas apply 不使用正则表达式函数
Pandas apply does nothing with regex function
感谢阅读并(希望)提供帮助!
我被 pandas 申请难住了。我在一个正则表达式函数上使用它,该函数在普通字符串上工作得很好,但是当我在数据帧上使用它时,它只输出相同的单元格值。这是函数:
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 Survey\nName'
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 Survey\nName'])
frame2 = frame.apply(lambda x: match_pattern(str(x)))
frame2 # outputs '3971 Small Arms Survey\nName'
我会尝试 iterrows 或 itertuples 等其他东西,但最终这个正则表达式函数应该用在大型数据帧的每个单元格上,任何比 apply 慢的东西都不可行。
match_pattern()
函数中的打印语句仅用于调试。如果您想知道,print('result.group(1)',result.group(1))
字符串会在以下两者中触发:'string' 上的应用程序和数据帧上的应用程序。但是打印输出不一样。在这两种情况下,打印输出都是函数 returns,在数据帧的情况下,它只是数据帧中开始的字符串,而对于字符串,打印输出是我想要过滤的字符串(即函数内正则表达式中的 group(1))。
非常感谢 Wiktor Stribiżew,他的评论回答了我的问题!事实证明这是一个简单、愚蠢的错误。在数据框的列上使用应用将起作用:
frame = frame[0].apply(match_pattern) # outputs 'Small Arms Survey' for the cell, which is what i want
您可以 运行 apply
在第 0
列:
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 Survey\nName'])
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):
恕我直言,检查 df_cell
的类型看起来更整洁。
感谢阅读并(希望)提供帮助! 我被 pandas 申请难住了。我在一个正则表达式函数上使用它,该函数在普通字符串上工作得很好,但是当我在数据帧上使用它时,它只输出相同的单元格值。这是函数:
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 Survey\nName'
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 Survey\nName'])
frame2 = frame.apply(lambda x: match_pattern(str(x)))
frame2 # outputs '3971 Small Arms Survey\nName'
我会尝试 iterrows 或 itertuples 等其他东西,但最终这个正则表达式函数应该用在大型数据帧的每个单元格上,任何比 apply 慢的东西都不可行。
match_pattern()
函数中的打印语句仅用于调试。如果您想知道,print('result.group(1)',result.group(1))
字符串会在以下两者中触发:'string' 上的应用程序和数据帧上的应用程序。但是打印输出不一样。在这两种情况下,打印输出都是函数 returns,在数据帧的情况下,它只是数据帧中开始的字符串,而对于字符串,打印输出是我想要过滤的字符串(即函数内正则表达式中的 group(1))。
非常感谢 Wiktor Stribiżew,他的评论回答了我的问题!事实证明这是一个简单、愚蠢的错误。在数据框的列上使用应用将起作用:
frame = frame[0].apply(match_pattern) # outputs 'Small Arms Survey' for the cell, which is what i want
您可以 运行 apply
在第 0
列:
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 Survey\nName'])
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):
恕我直言,检查 df_cell
的类型看起来更整洁。