DataFrame列填充异常:无法从列表内字典提取value值并赋值,报‘float对象不可订阅’错误
解决DataFrame提取字典列表中value值的问题
嘿,我来帮你搞定这个问题!你遇到的'float' object is not subscribable错误,核心原因是你把for循环和apply函数混在一起用了,咱们来一步步拆解:
为什么你的代码会报错?
apply函数本身就会遍历df["prices"]列的每一个元素,不需要外面再套一层for循环。当第一次执行df["prices"] = df["prices"].apply(lambda i:i[0]["value"])时,prices列已经被替换成了float类型的数值(也就是提取出来的value值)。这时候循环继续迭代,i就变成了float值,再去执行i[0]自然就会报错——因为浮点数不能用下标访问呀!
正确的解决方案
直接用apply处理整个列就好,不需要额外的循环,还可以加一些判断让代码更健壮:
简洁版代码
# 提取列表中第一个字典的value,处理空列表或非列表的情况 df["prices"] = df["prices"].apply(lambda x: x[0]["value"] if isinstance(x, list) and len(x) > 0 else None)
更健壮的版本(处理异常情况)
如果你的数据里可能存在空列表、字典缺少value键等异常情况,可以写一个专门的处理函数,避免个别坏数据导致整个操作失败:
def extract_price_value(item): try: # 先判断是否是有效列表,且列表不为空 if isinstance(item, list) and len(item) > 0: # 使用get方法,避免字典里没有value键时报错 return item[0].get("value", None) # 不是有效列表的情况返回None return None except Exception as e: print(f"处理元素时出现错误: {e}") return None # 应用函数到prices列 df["prices"] = df["prices"].apply(extract_price_value)
验证效果
执行完上面的代码后,df["prices"]列就会被替换成对应的value数值(比如示例中的5.2),再也不会出现浮点数下标访问的错误啦!
内容的提问来源于stack exchange,提问作者Adataguy
相关产品推荐
相关产品推荐

