如何在Pandas DataFrame列的嵌套字典中查找替换指定内容
嘿,我完全懂你碰到的这个麻烦——当col列里存的是实打实的字典对象,而不是字符串的时候,Pandas那些字符串处理方法肯定不管用,毕竟.str.contains()和replace()都是给字符串类型准备的嘛。别慌,给你几个实用的解决方案:
方法1:用apply()直接提取code值
这是最直接的路子,对列里每个元素用lambda函数,直接取出字典里的code键对应的值:
df['col'] = df['col'].apply(lambda x: x['code'] if isinstance(x, dict) else x)
这里加了isinstance(x, dict)的判断,是怕列里混着非字典的内容(比如NaN或者意外的字符串),避免运行时报错。
方法2:先转字典再提取(如果是字符串格式的字典)
有时候看起来是字典,其实可能是字符串形式的字典(比如从JSON文件读取时没做解析),要是这种情况,得先把字符串转成真正的字典:
import ast # 把字符串格式的字典转成实际字典对象 df['col'] = df['col'].apply(ast.literal_eval) # 再提取code值 df['col'] = df['col'].apply(lambda x: x['code'])
不过你说用str.contains()没效果,大概率你的列里是真正的字典对象,所以第一种方法更适合你。
方法3:用pd.json_normalize()展开字典(适合需要保留其他字段的场景)
如果你之后还要用到字典里的其他字段(比如description、root_cause),可以用这个方法把字典拆成多列,之后按需处理:
# 把col列的字典展开成单独的DataFrame dict_expanded = pd.json_normalize(df['col']) # 和原DataFrame合并,替换掉原来的col列 df = pd.concat([df.drop('col', axis=1), dict_expanded], axis=1) # 如果只需要保留code作为原col列的值,直接赋值就行 df['col'] = dict_expanded['code']
顺便说下为啥你之前的方法没用:.str.contains()这类方法是专门处理object类型下的字符串数据的,而你的列里是字典实例,这些方法根本没法识别字典内部的键值对,所以自然起不了作用啦。
内容的提问来源于stack exchange,提问作者Keithx
相关产品推荐
相关产品推荐

