如何将数据框的格式从两行转换为单行

how to convert the format of a dataframe from two rows to single

我有一个包含 16 列和 2 行的 pandas 数据框(sec01 到 sec16 和 x_data,y_data)

我想将其转换为另一个 1 行 32 列的数据框(x_sec01、y_sec01 到 x_sec16、y_sec16)

       sec01    sec02   sec03   sec04   sec05   sec06   sec07   sec08   sec09   sec10   sec11   sec12   sec13   sec14   sec15   sec16
x_data  -0  -0  -0  -0  -0  -0  -0  -0  -0  0   0   0   0.557336    0.604719    0.733460    1.019466
y_data  0   0   0   0   0   0   0   0   0   0   0   0   3.212005    2.692938    2.650384    3.085967

如何以最简单的方式做到这一点?

您可以先使用 unstackindex 创建 MultiIndex:

df.index = df.index.str.split('_', expand=True)
df1 = df.unstack(0)
df1.columns = ['_'.join((x[1], x[0])) for x in df1.columns]
print (df1)
      x_sec01  y_sec01  x_sec02  y_sec02  x_sec03  y_sec03  x_sec04  y_sec04  \
data        0        0        0        0        0        0        0        0   

      x_sec05  y_sec05    ...     x_sec12  y_sec12   x_sec13   y_sec13  \
data        0        0    ...           0        0  0.557336  3.212005   

       x_sec14   y_sec14  x_sec15   y_sec15   x_sec16   y_sec16  
data  0.604719  2.692938  0.73346  2.650384  1.019466  3.085967  

[1 rows x 32 columns]

另一个 concat 的解决方案:

df1 = pd.concat([df.loc['x_data'],df.loc['y_data']],keys=('x', 'y')).to_frame().sort_index(1)
df1.index = ['_'.join(x) for x in df1.index]
print (df1.T)
   x_sec01  y_sec01  x_sec02  y_sec02  x_sec03  y_sec03  x_sec04  y_sec04  \
0      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   

   x_sec05  y_sec05    ...     x_sec12  y_sec12   x_sec13   y_sec13   x_sec14  \
0      0.0      0.0    ...         0.0      0.0  0.557336  3.212005  0.604719   

    y_sec14  x_sec15   y_sec15   x_sec16   y_sec16  
0  2.692938  0.73346  2.650384  1.019466  3.085967  

[1 rows x 32 columns]

pd.DataFrame重构并重塑底层数组

pd.DataFrame(
    df.values.T.reshape(1, -1),
    columns=['{}_{}'.format(r, c)
             for c in df.columns.tolist()
             for r in df.index.str[0].tolist()])

解决方案的关键在于通过提供 Fortran-like 索引排序 (order='F') 来使用 numpy.reshape 来获得所需形状的数据。

之后,它只是格式化 DF 的 headers 通过使用 numpy.dstack 堆叠索引和列标签 depth-wise 获得的 DF

idx = df.index.str[0]
col = df.columns
head = np.dstack(('{}_'.format(idx[0]) + col, '{}_'.format(idx[1]) + col)).ravel()
pd.DataFrame(df.values.reshape(1, 32, order='F'), columns=head)

产生以下输出:

   x_sec01  y_sec01  x_sec02  y_sec02  x_sec03  y_sec03  x_sec04  y_sec04  \
0      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   

   x_sec05  y_sec05    ...     x_sec12  y_sec12   x_sec13   y_sec13   x_sec14  \
0      0.0      0.0    ...         0.0      0.0  0.557336  3.212005  0.604719   

    y_sec14  x_sec15   y_sec15   x_sec16   y_sec16  
0  2.692938  0.73346  2.650384  1.019466  3.085967  

[1 rows x 32 columns]