如何将数据框的格式从两行转换为单行
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
如何以最简单的方式做到这一点?
您可以先使用 unstack
从 index
创建 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]
我有一个包含 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
如何以最简单的方式做到这一点?
您可以先使用 unstack
从 index
创建 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]