将包含元组的DataFrame列转换为行

时间:2018-07-14 02:51:02

标签: python pandas dataframe

我有一个类似于以下内容的DataFrame:

   A         B       C    D          E        F
0  1  (10, 11)  (a, b)  abc         ()       ()
1  2  (10, 11)  (a, b)  def    (2, 19)   (j, k)
2  3        ()      ()  abc     (73,)      (u,)

其中某些列包含元组。如何为元组中的每个项目创建新行,使结果看起来像这样?

   A         D      B       C       E       F
0  1        abc     10      a       
1                   11      b
2  2        def     10      a       2       j
3                   11      b       19      k
4  3        abc                     73      u

我知道B和C列与E和F列始终具有相同数量的元素。

1 个答案:

答案 0 :(得分:2)

使用zip_longest from itertools。所有单值都包装在列表中,以便可以与其他列表(或元组)一起压缩

expanded = df.apply(
    lambda x: pd.DataFrame.from_records(zip_longest([x.A], x.B, x.C, [x.D], x.E, x.F), 
                                        columns=list('ABCDEF')), 
    axis=1
).values

这将创建一个数据帧数组,然后应将其连接以获得所需的结果。最后,应该重置索引以使其与期望的输出相匹配。

df_expanded = pd.concat(expanded).reset_index(drop=True).
# df_expanded outputs:
     A     B     C     D     E     F
0  1.0    10     a   abc  None  None
1  NaN    11     b  None  None  None
2  2.0    10     a   def     2     j
3  NaN    11     b  None    19     k
4  3.0  None  None   abc    73     u