如何从Pandas DataFrame的列表嵌套字典列提取值?
解决Pandas提取列表嵌套字典字段到新列的问题
你用str.fullmatch完全找错路子了——这个函数是用来判断整个字符串是否完全匹配某个正则表达式的,而你的age列是列表嵌套字典的结构化数据,不是纯字符串,所以肯定没用。
下面分几种常见场景给你解决办法:
场景1:每个age单元格是单元素列表,字典里有age_message键
比如单元格内容是[{"age_message": "30岁"}],直接用apply提取:
df['age_clean'] = df['age'].apply(lambda x: x[0]['age_message'] if x else None)
怕遇到空列表、键不存在的情况,加个异常处理更稳:
def get_age(item): try: return item[0]['age_message'] except (IndexError, KeyError, TypeError): return None df['age_clean'] = df['age'].apply(get_age)
场景2:每个age单元格是多元素列表,要提取所有age_message值
比如单元格内容是[{"age_message": "25岁"}, {"age_message": "30岁"}],可以选以下两种提取方式:
# 提取成逗号分隔的字符串 df['age_clean'] = df['age'].apply(lambda x: ','.join([d.get('age_message') for d in x]) if x else None) # 提取成列表保留原结构 df['age_clean'] = df['age'].apply(lambda x: [d.get('age_message') for d in x] if x else None)
场景3:如果age列是字符串格式的列表字典(爬取时存成了字符串)
比如单元格内容是'[{"age_message": "28岁"}]',得先把字符串转成结构化数据:
import ast # 先把字符串转成列表字典 df['age'] = df['age'].apply(ast.literal_eval) # 再用场景1或2的方法提取 df['age_clean'] = df['age'].apply(lambda x: x[0]['age_message'] if x else None)
为啥你原来的代码没用?
dff['age'].str.fullmatch('age_message')是把每个单元格当成字符串处理,检查它的字符串形式是不是完全等于age_message——你的单元格是列表字典,转成字符串后肯定和age_message不一样,所以结果要么全是False,要么直接报错。
内容的提问来源于stack exchange,提问作者Mela
相关产品推荐
相关产品推荐

