Pandas:水平扩展/分解数据框

Nk0*_*k03 5 python dataframe python-3.x pandas pandas-groupby

这可能是重复的,但我找不到所需的答案。所以,问题是:

假设,我有一个像这样的数据框:

d1 = {'col1':  [[1],[2,3]],
      'col2' : [[3],[21,1]]}

df1 = pd.DataFrame(d1)
Run Code Online (Sandbox Code Playgroud)
第 1 列 列2
0 [1] [3]
1 [2, 3] [21, 1]

现在,我们可以通过 非常轻松地垂直扩展这个数据框df1.apply(pd.Series.explode)。但是,水平方向扩展和更改列名称的最优雅的方式是什么?

像这样的东西:

d2 = {
    'col1_1':[1,2],
    'col1_2': [np.NAN,3],
    'col2_1' : [3,21],
    'col2_2' : [np.NAN,1]
}
df2 = pd.DataFrame(d2)
Run Code Online (Sandbox Code Playgroud)

输出:

列1_1 列1_2 列2_1 列2_2
0 1 3
1 2 3.0 21 1.0

And*_*ely 7

x = pd.concat(
    [df1[c].apply(pd.Series).add_prefix(c + "_") for c in df1], axis=1
)
print(x)
Run Code Online (Sandbox Code Playgroud)

印刷:

   col1_0  col1_1  col2_0  col2_1
0     1.0     NaN     3.0     NaN
1     2.0     3.0    21.0     1.0
Run Code Online (Sandbox Code Playgroud)

如果您想要从 1 开始的索引列:

x = pd.concat(
    [df1[c].apply(pd.Series).add_prefix(c + "_") for c in df1], axis=1
).rename(
    columns=lambda x: "{}_{}".format(x.split("_")[0], int(x.split("_")[1]) + 1)
)
print(x)
Run Code Online (Sandbox Code Playgroud)

印刷:

   col1_1  col1_2  col2_1  col2_2
0     1.0     NaN     3.0     NaN
1     2.0     3.0    21.0     1.0
Run Code Online (Sandbox Code Playgroud)