我有一个类似于以下内容的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列始终具有相同数量的元素。
答案 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