【发布时间】:2020-12-31 17:20:57
【问题描述】:
- 此问题特定于
pandas.DataFrame中的数据列 - 这个问题取决于列中的值是
str、dict还是list类型。 - 当
df.dropna().reset_index(drop=True)不是有效选项时,此问题涉及处理NaN值。
案例一
- 对于
str类型的列,在使用.json_normalize之前,必须将该列中的值转换为dict类型,使用ast.literal_eval。
import numpy as np
import pandas as pd
from ast import literal_eval
df = pd.DataFrame({'col_str': ['{"a": "46", "b": "3", "c": "12"}', '{"b": "2", "c": "7"}', '{"c": "11"}', np.NaN]})
col_str
0 {"a": "46", "b": "3", "c": "12"}
1 {"b": "2", "c": "7"}
2 {"c": "11"}
3 NaN
type(df.iloc[0, 0])
[out]: str
df.col_str.apply(literal_eval)
错误:
df.col_str.apply(literal_eval) results in ValueError: malformed node or string: nan
案例 2
- 对于
dict类型的列,使用pandas.json_normalize将键转换为列标题,将值转换为行
df = pd.DataFrame({'col_dict': [{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}, {"c": "11"}, np.NaN]})
col_dict
0 {'a': '46', 'b': '3', 'c': '12'}
1 {'b': '2', 'c': '7'}
2 {'c': '11'}
3 NaN
type(df.iloc[0, 0])
[out]: dict
pd.json_normalize(df.col_dict)
错误:
pd.json_normalize(df.col_dict) results in AttributeError: 'float' object has no attribute 'items'
案例 3
- 在
str类型的列中,dict在list内。 - 标准化列
- 应用
literal_eval,因为explode 不适用于str类型 - 分解列以分隔
dicts以分隔行 - 规范化列
- 应用
df = pd.DataFrame({'col_str': ['[{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}]', '[{"b": "2", "c": "7"}, {"c": "11"}]', np.nan]})
col_str
0 [{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}]
1 [{"b": "2", "c": "7"}, {"c": "11"}]
2 NaN
type(df.iloc[0, 0])
[out]: str
df.col_str.apply(literal_eval)
错误:
df.col_str.apply(literal_eval) results in ValueError: malformed node or string: nan
【问题讨论】:
标签: python json pandas dictionary json-normalize