重塑数据框:从列到行

时间:2018-10-22 14:19:55

标签: python pandas dataframe reshape

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

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)

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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提取一个可迭代的数据帧,并将其组合以构造单个数据帧。

答案 2 :(得分:1)

使用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