我有一个与此类似的数据框:
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
我想知道这是否可能吗?
答案 0 :(得分:3)
有多个apply
的性能不好的解决方案,如果您有相对大的数据,则应使用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
答案 1 :(得分:2)
这是一个基于pivot
的解决方案,具有一定程度的扁平化。
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