Pandas:在df中为包含列表值的爆炸列创建多个行

时间:2017-11-02 15:03:23

标签: python pandas dataframe

我有一个数据框

        A       B        C  
0       14      218     [{u'END_DT': None, u'ARBITRARY_ID':...   
1       19      263     [{u'END_DT': None, u'ARBITRARY_ID':... 

C列是字典列表。我想爆炸列表,以便每个索引都有多行用于字典数量(列表中的元素)。有多种方法可以这样做,但我陷入了一个特定的阶段,并对解决它感到好奇。我像这样爆炸了C栏:

df.C.apply(pd.Series).stack().reset_index(level=1, drop=True).to_frame('C')

所以我得到的是:

                C
0   {u'END_DT': None, u'ARBITRARY_ID': ...
0   {u'END_DT': None, u'ARBITRARY_ID': ...
0   {u'END_DT': None, u'ARBITRARY_ID': ...
0   {u'END_DT': None, u'ARBITRARY_ID': ...
0   {u'END_DT': None, u'ARBITRARY_ID': ...
1   {u'END_DT': None, u'ARBITRARY_ID': ...
1   {u'END_DT': 1475149637313, u'ARBITRARY_ID...
1   {u'END_DT': None, u'ARBITRARY_ID': ...
1   {u'END_DT': 1475149637313, u'ARBITRARY_ID...
2   {u'END_DT': None, u'ARBITRARY_ID': ...
2   {u'END_DT': None, u'ARBITRARY_ID': ...

有没有办法将其加入我的主df看到索引匹配。

1 个答案:

答案 0 :(得分:2)

首先删除drop之前的原始列C,然后join删除原始列reset_index以及index

a = df.C.apply(pd.Series).stack().reset_index(level=1, drop=True).to_frame('C')
df = df.drop('C', axis=1).join(a).reset_index(drop=True)

a系列的更快替代方案:

a = pd.DataFrame(df.C.values.tolist()).stack().reset_index(level=1, drop=True).to_frame('C')