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

4

我有一个pandas数据框,它有16列和2行(从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

如何以最简单的方式实现这个?
3个回答

2

您可以首先使用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]

2

使用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()])

enter image description here


谢谢您先生,您是真正的天才。我想把它格式化为x_sec01、y_sec01、x_sec02、y_sec02,我需要更改哪个部分? - thirteenmac

1
解决方案的关键在于使用numpy.reshape,通过提供类似Fortran的索引顺序(order='F')来使数据达到所需的形状。
之后,只需使用numpy.dstack将索引和列标签深度堆叠,格式化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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接