将字典行转换为单独的pandas列

时间:2016-12-01 10:57:29

标签: python pandas dictionary

我有两列数据框。其中一个具有由多个键和值组成的字典值。我想将这些字典键扩展为单独的列。大熊猫有可能吗?

In [1]:print df
Out[2]:
  ID    column_2
0  1    {u'color':'blue',u'counts':10}
1  3    {u'color':'red',u'counts':30}
2  10   {u'color':'purple',u'counts':12}
...

到以下所需的输出:

   ID  color   counts
0   1  'blue'      10
1   3  'red'       30
2   10  'purple'   12

2 个答案:

答案 0 :(得分:4)

请注意,您可以执行以下操作:

In [3]: pd.DataFrame(df.col2.values.tolist())
Out[3]: 
    color  counts
0    blue      10
1     red      30
2  purple      12

所以只需使用concat从那里一起破解它:

In [4]: pd.concat((df.ID, pd.DataFrame(df.col2.values.tolist())),axis=1)
Out[4]: 
   ID   color  counts
0   1    blue      10
1   3     red      30
2  10  purple      12

<强>计时

In [132]: %timeit (pd.concat((df.ID, pd.DataFrame(df.column_2.tolist())),axis=1))
1 loop, best of 3: 339 ms per loop

In [133]: %timeit (pd.concat((df.ID, pd.DataFrame(df.column_2.values.tolist())),axis=1))
1 loop, best of 3: 322 ms per loop

In [134]: %timeit pd.concat([df, df.column_2.apply(lambda x: pd.Series(x))], axis=1)
1 loop, best of 3: 1min 7s per loop

时间安排的代码

df = pd.DataFrame({'ID':[1,3,10],
                   'column_2':[{u'color':'blue',u'counts':10},
                               {u'color':'red',u'counts':30},
                               {u'color':'purple',u'counts':12}]})

df = pd.concat([df]*100000).reset_index(drop=True)
#[300000 rows x 3 columns]
print (df)

答案 1 :(得分:0)

无论你的数据框中是否有字典作为数据类型(可能没有意义),这都可以完成这项任务:

df2 = pd.concat([df, df.column_2.apply(lambda x: pd.Series(x))], axis=1)
df2

   ID                           column_2   color  counts
0   1    {'counts': 10, 'color': 'blue'}    blue      10
1   3     {'counts': 30, 'color': 'red'}     red      30
2  10  {'counts': 12, 'color': 'purple'}  purple      12

然后你可以df2 = df2[[x for x in df2.columns if x != 'column_2']]

确保您的列中有实际的dict,而不是字典的字符串表示。例如,当我加载数据时,它是一个字符串表示,所以我必须改变它:

df = pd.read_clipboard()
df.column_2 = df.column_2.apply(lambda x: eval(x))