将包含字典列表的列转换为pandas dataframe中的多个列

时间:2017-07-26 09:16:46

标签: python pandas

我有一个像以下的Pandas数据框:

pd.DataFrame({'a':[1,2], 'b':[[{'c':1,'d':5},{'c':3, 'd':7}],[{'c':10,'d':50}]]})
Out[2]: 
   a                                         b
0  1  [{u'c': 1, u'd': 5}, {u'c': 3, u'd': 7}]
1  2                    [{u'c': 10, u'd': 50}]

如果'b'中有多个元素,我想扩展'b'列并重复'a'列:

Out[2]: 
   a   c   d
0  1   1   5
1  1   3   7
2  2  10  50

我尝试在每一行使用apply函数但是我没有成功,显然是将一行转换为一行。

1 个答案:

答案 0 :(得分:2)

您可以concat使用list comprehension

df = pd.concat([pd.DataFrame(x) for x in df['b']], keys=df['a'])
       .reset_index(level=1, drop=True).reset_index()

print (df)
   a   c   d
0  1   1   5
1  1   3   7
2  2  10  50

编辑:

如果index是唯一的,则可以对所有列使用join

df1 = pd.concat([pd.DataFrame(x) for x in df['b']], keys=df.index)
        .reset_index(level=1,drop=True)
df = df.drop('b', axis=1).join(df1).reset_index(drop=True)
print (df)
   a   c   d
0  1   1   5
1  1   3   7
2  2  10  50

我尝试简化解决方案:

l = df['b'].str.len()
df1 = pd.DataFrame(np.concatenate(df['b']).tolist(), index=np.repeat(df.index, l))
df = df.drop('b', axis=1).join(df1).reset_index(drop=True)
print (df)
   a   c   d
0  1   1   5
1  1   3   7
2  2  10  50