如何从pandas存储JSON的列按条件提取值仅填充null行
现有代码的问题
- 列名大小写不匹配:原始DataFrame定义的列名为小写
col1,代码中使用大写Col1访问,会导致要么读取不到对应列,要么生成冗余的新列,原col1的非空值无法保留。 - apply逻辑完全错误:筛选出
col1为空的子DataFrame后,行模式下apply的入参是单行的Series对象,不需要额外加循环索引i,你写的列表推导式不仅逻辑错误,返回的列表结构也无法和原有行对齐,同时直接给整个df['Col1']赋值会把原col1非空的行全部覆盖为NaN。 - 示例数据语法错误:Python3不支持
06010这类以0开头的十进制整型字面量,需要改成字符串格式如"06010"才能正常运行。
正确实现方案
推荐用pandas的str访问器提取字典嵌套值,搭配loc定向修改符合条件的行,性能远高于apply写法:
import pandas as pd import numpy as np df = pd.DataFrame({'col1': ["06010", np.nan, "06020", np.nan], 'json_col': [{'Id': '060', 'Date': '20210908', 'value': {'Id': '060', 'Code': '06037'} }, {'Id': '061', 'Date': '20210908', 'value': {'Id': '060', 'Code': '06038'} }, {'Id': '062', 'Date': '20210908', 'value': {'Id': '060', 'Code': '06039'} }, {'Id': '063', 'Date': '20210908', 'value': {'Id': '060', 'Code': '06040'} }], }) # 仅修改col1为空的行,提取json_col嵌套的Code值 df.loc[df['col1'].isnull(), 'col1'] = df['json_col'].str['value'].str['Code']
运行后df['col1']的输出完全符合预期:
0 06010 1 06038 2 06020 3 06040 Name: col1, dtype: object
如果你一定要用apply实现,正确写法如下:
df.loc[df['col1'].isnull(), 'col1'] = df[df['col1'].isnull()].apply(lambda x: x['json_col']['value']['Code'], axis=1)
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

