统一格式不一致的Pandas DataFrame中的JSON

时间:2019-06-14 20:04:08

标签: python pandas

我正在使用pandas数据框中的列,我想将其展平为列。问题在于某些列是单个词典,而另一些是词典列表。

例如,列中单元格中的数组可能看起来像这样:

{'a':'x','b':'y','c':'z'}

或类似的

[{'a':'x','b':'y','c':'z'},{'a':'d','b':'e','c' :'f'}]

我一直在使用标准的json_normalize函数,但是输出似乎无法处理存在两种不同类型的数组:

json_flattened = pd.io.json.json_normalize(df.json_cell.apply(json.loads))

这给了我AttributeError: 'list' object has no attribute 'items'

我希望弄清楚另一端是一个数据帧,该数据帧最终将具有与数组中重复的元素一样多的列。

.-------.---.---.---.-----.-----.------.
| index | a | b | c | a_1 | b_1 | c_1  |
:-------+---+---+---+-----+-----+------:
|     0 | x | y | z | NaN | NaN | NaN  |
:-------+---+---+---+-----+-----+------:
|     1 | x | y | z | d   | e   | f    |
'-------'---'---'---'-----'-----'------'

1 个答案:

答案 0 :(得分:1)

由于列中格式不一致,您别无选择,只能遍历该列并检查每个单元格。

import pandas as pd
import numpy as np
from pandas.io.json import json_normalize


data = pd.DataFrame({'json':[{'a': 'x', 'b': 'y', 'c': 'z'},[{'a': 'x', 'b': 'y', 'c': 'z'}, {'a': 'd', 'b': 'e', 'c': 'f'}]]})

dflist = []
for index, row in data.iterrows():
    norm = json_normalize(data['json'][index])
    dflist.append(norm)

grouped = pd.concat(dflist, keys = np.arange(len(dflist)))

df2 = grouped.reset_index()

df2 = df2.pivot('level_0','level_1')

df2.index.name = None
df2.columns.names = [None, None]
df2.columns = df2.columns.map('{0[0]}_{0[1]}'.format) 

#output

    a_0  a_1    b_0  b_1    c_0  c_1
0   x    NaN    y    NaN    z    NaN
1   x    d      y    e      z    f

我们遍历该列,将每一行读入其自己的df中。接下来,我们将它们组合在一起,但是分配每个键以使其分组。接下来,我们将重点介绍键和索引。最后,我们操纵从枢轴生成的多级列以获取所需的内容。