我有一个列为messages
的表,它有一个很大的混乱字典。我想从单元格中提取标题。
df["title"] = df["messages"].apply(
lambda x: re.search(
r"'title': '(.*?)',", str(x)))
输出:<re.Match object; span=(364, 456), match="'title': 'Creating different tests on glass width.>
df["title"] = df["messages"].apply(
lambda x: re.search(
r"'title': '(.*?)',", str(x)).group(1)
)
下面的行给了我一个AttributeError: 'NoneType' object has no attribute 'group'
错误。与团队合作。
这是因为某些行包含空值。不知道如何绕过这个问题。
编辑:
df["title"] = df["messages"].apply(
lambda x: re.search(
r"'title': '(.*?)',", str(x)).group(1) if x else None)
消息列:
[{'id': '42', 'value': '32', 'state_id': '0', 'state_version': '1', .... 'title': Creating different tests on glass width.', 'preheader_text': 'Could the width effect the colour of the inside material’, …
它并不完全是一个字典,其余的代码有一堆html和css脚本。这就是为什么我不能简单地把它当作一本字典。
如果messages
列包含实际的Python字典,则只使用dict.get()
方法。这样做的优点是,如果缺少标题,则提供默认返回None
。
df = pd.DataFrame({'messages': [{'title': 'title 1', 'field': 'something'},
{'title': 'title 2', 'field': 'other'},
None, # None
'', # empty string
{'field': 'no title'},
{'another field': "'title': 'not a title field', "},
]})
# df is:
messages
0 {'title': 'title 1', 'field': 'something'}
1 {'title': 'title 2', 'field': 'other'}
2 None
3
4 {'field': 'no title'}
5 {'another field': ''title': 'not a title field', '}
获得标题:
df['messages'].apply(lambda x: x.get('title') if x else None)
# output:
0 title 1
1 title 2
2 None
3 None
4 None
5 None
Name: messages, dtype: object
此外,即使添加了if x else None
,您使用的regex方法在某些情况下也会失败。例如,如果单元格为非空、非None且不包含regex。考虑df
设置如下:
df = pd.DataFrame({'messages': [{'title': 'title 1', 'field': 'something'},
{'title': 'title 2', 'field': 'other'},
{'another field': "'title': 'not a title field', "},
]})
# df is:
messages
0 {'title': 'title 1', 'field': 'something'}
1 {'title': 'title 2', 'field': 'other'}
2 {'another field': ''title': 'not a title field', '}
尝试正则表达式:
df["messages"].apply(lambda x: re.search(
r"'title': '(.*?)',", str(x)).group(1) if x else None)
# output is wrong:
0 title 1
1 title 2
2 not a title field
Name: messages, dtype: object