我有两列数据框。其中一个具有由多个键和值组成的字典值。我想将这些字典键扩展为单独的列。大熊猫有可能吗?
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
答案 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))