Python 将字典列转换为单个数据帧

Python 将字典列转换为单个数据帧,python,pandas,dataframe,dictionary,Python,Pandas,Dataframe,Dictionary,我有一个与此类似的数据帧: data 0 [{'v': 10, 'n': 'metric2'}] 27 [{'v': 20, 'n': 'metric1'}, {'v': 56, 'n': 'metric3'}] 51 [{'v': 20, 'n': 'metric3'}] 89 [{'v': 10, 'n': 'metric2'}] 我想

我有一个与此类似的数据帧:

                     data
0                    [{'v': 10, 'n': 'metric2'}]
27   [{'v': 20, 'n': 'metric1'}, {'v': 56, 'n': 'metric3'}]
51                   [{'v': 20, 'n': 'metric3'}]
89                   [{'v': 10, 'n': 'metric2'}]
我想把它变成这样:

    metric1 metric2 metric3
0   NaN     10     NaN
27  20      NaN    56
51  NaN     NaN    20
89  NaN     10     NaN

我想知道这是否可行?

这是一个基于
透视的解决方案,具有一定程度的扁平化

from itertools import chain

df2 = pd.DataFrame(chain.from_iterable(df['data']))
df2.insert(0, 'idx', df.index.repeat(df['data'].str.len()))

df2.pivot(*df2)

n    metric1  metric2  metric3
idx                           
0        NaN     10.0      NaN
27      20.0      NaN     56.0
51       NaN      NaN     20.0
89       NaN     10.0      NaN
在单行中,此操作可以通过

(pd.DataFrame(chain.from_iterable(df['data']))
   .assign(idx=df.index.repeat(df['data'].str.len()))
   .pivot('idx', 'n', 'v'))

n    metric1  metric2  metric3
idx                           
0        NaN     10.0      NaN
27      20.0      NaN     56.0
51       NaN      NaN     20.0
89       NaN     10.0      NaN

多个
apply
,是一个性能差的解决方案,如果您有相对大的数据,您应该使用


这真是太棒了,而且工作起来非常快,非常感谢。它完成了这项工作,但正如您所建议的,我的数据集是200k+个条目,所以cs95的解决方案更快。无论如何谢谢你!
s.apply(pd.Series).stack().apply(pd.Series).set_index('n',append=True).v.unstack('n').sum(level=0)
Out[86]: 
n   metric1  metric2  metric3
0       0.0     10.0      0.0
27     20.0      0.0     56.0
51      0.0      0.0     20.0
89      0.0     10.0      0.0