重塑数据框:列到行

reshape dataframe: columns to lines

我有一个数据框 df_given [n, m],我想将每 3 行的列值更改为行值。

import pandas as pd
df_test1 = pd.DataFrame({'A1': np.arange(1,4), 'B1': np.arange(10, 13), 'C1': np.arange(20, 23)})
df_test2 = pd.DataFrame({'A1': np.arange(11,14), 'B1': np.arange(100, 103), 'C1': np.arange(200, 203)})  
df_given = pd.concat((df_test1, df_test2), axis =0)

df_desired = pd.DataFrame({'A': [1,10,20,11, 100, 200], 'B':[2,11, 21,12, 101, 201], 'C':[3,12,22,13, 102, 202]})
df_desired.head(10)

df_given.head(10)

IIUC

pd.concat([x for _,x in df_given.groupby((df_given.index==0).cumsum())],axis=1).T
Out[997]: 
      0    1    2
A1    1    2    3
B1   10   11   12
C1   20   21   22
A1   11   12   13
B1  100  101  102
C1  200  201  202

pd.concatGroupBy 一起使用:

df = df.reset_index(drop=True)

res = pd.concat((pd.DataFrame(df_slice.T.values, columns=df.columns.str[0]) \
                for _, df_slice in df.groupby(df.index // 3)), ignore_index=True)

print(res)

     A    B    C
0    1    2    3
1   10   11   12
2   20   21   22
3   11   12   13
4  100  101  102
5  200  201  202

说明

  • df.reset_index(drop=True) 将数据帧索引重置为常规 pd.RangeIndex,即 0, 1, 2, ..., n.
  • df.groupby(df.index // 3) 将数据帧分组为 3 行的块。我们在生成器理解中迭代这个 GroupBy 对象。
  • df_slice.T.values 转置构成切片的 3 行并转换为 NumPy 数组。我们将其提供给 pd.DataFrame 以从 NumPy 数组构建数据框。
  • pd.concat 采用可迭代的数据帧并将它们组合起来构建一个数据帧。

另一种方法使用 groupbystackunstack

df1 = df_given.assign(g=df_given.groupby(level=0).cumcount()).set_index('g',append=True)

df1 = df1.stack().unstack(0).reset_index(drop=True)

df1.columns = df_given.columns

print (df1)


   A1   B1  C1
0   1   2   3
1   10  11  12
2   20  21  22
3   11  12  13
4   100 101 102
5   200 201 202