【发布时间】:2018-09-12 19:52:53
【问题描述】:
我有一个来自测试回归失败的错误消息的 csv,我正在将其导入 pandas 数据帧,但我想找到一些与异常有关的子字符串,特别是。
我用 .csv 的内容填充我的数据框,如下所示:
df = pd.read_csv('ErrorMessage3.csv', header=None, sep=',',
names=['ErrorMessage'])
我有以下正则表达式和相应的测试字符串(这是我的数据框错误消息列中的第一个条目),它返回的正是我想要的:
teststring = "Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp
Date Record from Epay Account {DBServer;UserName;Password='',
DatabaseName='',Year Offset='-10'}> --->
System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or
property cannotbecalled
on Null values. ---> System.Data.SqlTypes.SqlNullValueException2: Data is Null."
re.findall(r"---> ([^:]+): ", teststring)
导致以下输出:
['System.Data.SqlTypes.SqlNullValueException',
'System.Data.SqlTypes.SqlNullValueException2']
但我希望能够将其添加为我的数据框中的“例外”列。我认为这会起作用:
df['Exceptions'] = df['ErrorMessage'].str.extract(r"---> ([^:]+): ")
但是当我运行它时,我添加了我的“异常”列,但所有行都是 NaN。我验证了我的 ErrorMessage 是对象类型,并且我使用了在线正则表达式测试器来验证我的 ErrorMessage 条目的至少一个子集确实包含与我的正则表达式匹配的异常。我已经阅读了其他一些看起来非常相似的堆栈溢出问题,但我运气不佳。
为什么将正则表达式应用于数据框会产生 nan,但将其应用于单个字符串会返回我想要的结果?
【问题讨论】:
-
试试
df['Exceptions'] = df['ErrorMessage'].str.extractall(r"---> ([^:]+)").apply(", ".join) -
@WiktorStribiżew 相同的结果,我的 Exceptions 列仅包含 NaN
-
@Sphinx 是的,如果我获取测试字符串并手动将其分配为我的数据框中的一个元素,它确实有效。问题是,当通过读取 .csv 填充数据框时,它不起作用。我将首先进行编辑以显示我是如何读取数据的,也许这会有所帮助。
-
@sphinx 不确定我是否遵循,我针对数据框的错误消息列中存在的几个条目测试了我的正则表达式,并且我用来演示的测试字符串是从该列中的第一个条目复制的.这是这里的关键问题:我知道正则表达式在应用于该字符串时会返回一些内容,但在直接应用于数据框时它不起作用。
-
str.extract 只会在字符串pandas.pydata.org/pandas-docs/stable/generated/…中找到第一个匹配项
标签: python regex pandas dataframe