从df列中的单元格字典中提取项



我有一个列为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

最新更新