Pandas用apply从JSON列取值替换列值时报Series真值模糊错误如何解决
报错原因
- 核心问题1:你在
apply的lambda函数中调用df['json_col'].str['value'].str['Code']返回的是长度等于DataFrame总行数的Series,而按行执行的apply要求每行返回单个值,维度不匹配触发了真值判断歧义的报错。 - 核心问题2:你先筛选
df[df['col1'] == 0]再直接赋值给整列df['col1'],会导致原col1不为0的行(比如示例中的第二行原本为NaN)被错误覆盖为空值。
最优实现方案(无需apply,性能更高)
直接用布尔索引匹配赋值即可,自动兼容Code为NaN、json_col为NaN的场景:
import pandas as pd import numpy as np # 先提取所有行的Code值 code_series = df['json_col'].str['value'].str['Code'] # 仅给col1为0的位置赋值对应的Code值 df.loc[df['col1'] == 0, 'col1'] = code_series[df['col1'] == 0]
运行后的df['col1']结果为[6037.0, nan, nan, nan],完全符合需求:
- 第一行原col1为0,替换为Code值6037
- 第二行原col1为NaN,保留原值
- 第三行json_col为NaN,提取Code为NaN,替换原0值为NaN
- 第四行Code本身为NaN,替换原0值为NaN
可选apply实现方案
如果需要用apply实现,要按行取当前行的字段值,同时做非空判断避免报错:
df['col1'] = df.apply( lambda x: x['json_col']['value']['Code'] if x['col1'] == 0 and pd.notna(x['json_col']) else x['col1'], axis=1 )
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

