在熊猫中扩展数组

时间:2019-08-16 12:28:04

标签: python pandas dataframe

我有以下数据:

data = [{
  'color': ['red','green'],
  'name': 'obj1' 
}, {
  'color': ['blue','brown','pink'],
  'name': 'obj2'
}]

当我使用熊猫时,它会给我这样的输出:

    color                 name
0   [red, green]          obj1
1   [blue, brown, pink]   obj2

但是我需要这样的输出:

    color.0  color.1  color.2  name
0   red      green    NaN         obj1
1   blue     brown    pink     obj2

我尝试过json_normalize,但无法获得所需的输出。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以预处理字典列表,然后调用DataFrame构造函数:

out = []
for x in data:
    d = {}
    for k, v in x.items():
        if isinstance(v, list):
            for i, y in enumerate(v):
                d['{}.{}'.format(k,i)] = y
        else:
            d[k] = v
    out.append(d)
print (out)
[{'color.0': 'red', 'color.1': 'green', 'name': 'obj1'}, 
 {'color.0': 'blue', 'color.1': 'brown', 'color.2': 'pink', 'name': 'obj2'}]

df = pd.DataFrame(out).sort_index(axis=1)
print (df)
  color.0 color.1 color.2  name
0     red   green     NaN  obj1
1    blue   brown    pink  obj2

您可以创建DataFrame,然后将列表列扩展为多个:

df = pd.DataFrame(data)
df1 = pd.DataFrame(df.pop('color').values.tolist(), index=df.index)

df = df.join(df1.add_prefix('color.')).sort_index(axis=1)
print (df)
  color.0 color.1 color.2  name
0     red   green    None  obj1
1    blue   brown    pink  obj2

答案 1 :(得分:0)

您可以使用pd.Series:

df = pd.DataFrame(data)
df[['color.0',  'color.1', 'color.2']]=df.color.apply(pd.Series)
df.drop('color',1)

    name    color.0 color.1 color.2
0   obj1    red     green   NaN
1   obj2    blue    brown   pink