通过将列附加到列来重塑 Pandas 数据框

时间:2021-07-27 07:11:36

标签: python python-3.x pandas dataframe

我确实有一个像 (df1) 的 Pandas df:

     0 1 2  3   4  5
   0 a b c  d   e  f
   1 1 4 7  10  13 16
   2 2 5 8  11  14 17
   3 3 6 9  12  15 18

我想生成一个像 (df2) 这样的数据框:

   0  1  2 
0  a  b  c
1  1  4  7
2  2  5  7 
3  3  6  9
4  d  e  f 
5  10 13 16
6  11 14 17
7  12 15 18

关于给定 df 的附加信息:

  1. 给定 df 的形状尚不清楚。 b = df1.shape() -> b = [n,m]
  2. df1 的宽度可以被 3 整除是一个给定的事实

我确实尝试过stack、melt和wide_to_long。通过使用堆栈,行的顺序会丢失,行的行为应如示例 df2 所示。我真的很感激任何帮助。

亲切的问候汉斯

2 个答案:

答案 0 :(得分:1)

您可以使用DataFrame.append

a = df[df.columns[: len(df.columns) // 3 + 1]]
b = df[df.columns[len(df.columns) // 3 + 1 :]]
b.columns = a.columns

df_out = a.append(b).reset_index(drop=True)
print(df_out)

打印:

    0   1   2
0   a   b   c
1   1   4   7
2   2   5   8
3   3   6   9
4   d   e   f
5  10  13  16
6  11  14  17
7  12  15  18

编辑:处理未知宽度:

dfs = []
for i in range(0, len(df.columns), 3):
    dfs.append(df[df.columns[i : i + 3]])
    dfs[-1].columns = df.columns[:3]

df_out = pd.concat(dfs)
print(df_out)

打印:

    0   1   2
0   a   b   c
1   1   4   7
2   2   5   8
3   3   6   9
0   d   e   f
1  10  13  16
2  11  14  17
3  12  15  18
0   g   h   i
1  19  22  25
2  20  23  26
3  21  24  27

答案 1 :(得分:1)

使用 np.vstacknp.hsplit

>>> pd.DataFrame(np.vstack(np.hsplit(df, df.shape[1] / 3)))
    0   1   2
0   a   b   c
1   1   4   7
2   2   5   8
3   3   6   9
4   d   e   f
5  10  13  16
6  11  14  17
7  12  15  18

另一个例子:

>>> df
   0  1  2   3   4   5   6   7   8
0  a  b  c   d   e   f   g   h   i
1  1  4  7  10  13  16  19  22  25
2  2  5  8  11  14  17  20  23  26
3  3  6  9  12  15  18  21  24  27

>>> pd.DataFrame(np.vstack(np.hsplit(df, df.shape[1] / 3)))
     0   1   2
0    a   b   c
1    1   4   7
2    2   5   8
3    3   6   9
4    d   e   f
5   10  13  16
6   11  14  17
7   12  15  18
8    g   h   i
9   19  22  25
10  20  23  26
11  21  24  27