我正在使用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 |
'-------'---'---'---'-----'-----'------'
答案 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中。接下来,我们将它们组合在一起,但是分配每个键以使其分组。接下来,我们将重点介绍键和索引。最后,我们操纵从枢轴生成的多级列以获取所需的内容。