我看过类似的问题,但我的问题更直接,更抽象。
我有一个带有" n"的数据帧。行,是" n"一个小数字。我们可以假设索引只是行号。 我想把它转换成一行。
例如,如果我有
A,B,C,D,E
---------
1,2,3,4,5
6,7,8,9,10
11,12,13,14,5
我想要一个带有单行的数据帧:
A_1,B_1,C_1,D_1,E_1,A_2,B_2_,C_2,D_2,E_2,A_3,B_3,C_3,D_3,E_3
--------------------------
1,2,3,4,5,6,7,8,9,10,11,12,13,14,5
在Pandas中最常用的方法是什么?
答案 0 :(得分:6)
让我们尝试使用stack
,to_frame
和T:
df.index = df.index + 1
df_out = df.stack()
df_out.index = df_out.index.map('{0[1]}_{0[0]}'.format)
df_out.to_frame().T
输出:
A_1 B_1 C_1 D_1 E_1 A_2 B_2 C_2 D_2 E_2 A_3 B_3 C_3 D_3 E_3
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5
答案 1 :(得分:4)
我们需要stack
和swaplevel
df1=df.stack().swaplevel()
df1.index=df1.index.map('{0[0]}_{0[1]}'.format)
df1.to_frame().T
Out[527]:
A_0 B_0 C_0 D_0 E_0 A_1 B_1 C_1 D_1 E_1 A_2 B_2 C_2 D_2 E_2
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5
或者你可以使用numpy
pd.DataFrame(data=np.concatenate(df.values),index=[m+'_'+str(n) for m,n in zip(df.columns.tolist()*3,np.repeat([1,2,3],df.shape[1]))]).T
Out[551]:
A_1 B_1 C_1 D_1 E_1 A_2 B_2 C_2 D_2 E_2 A_3 B_3 C_3 D_3 E_3
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5
答案 2 :(得分:3)
拆开并映射即
ndf = df.unstack().to_frame().T
ndf.columns = ndf.columns.map('{0[0]}_{0[1]}'.format)
A_0 A_1 A_2 B_0 B_1 B_2 C_0 C_1 C_2 D_0 D_1 D_2 E_0 E_1 E_2
0 1 6 11 2 7 12 3 8 13 4 9 14 5 10 5
如果您想要排序的列,那么您可以
ndf = df.unstack().to_frame().T.sort_index(1,1)
答案 3 :(得分:0)
使用列表推导的另一种方法-
ndf = pd.DataFrame(df.values.reshape(1, -1)[0]).T
ndf.columns = [j + '_' + str(i) for i in range(1, 4) for j in df.columns]