将Pandas DataFrame转换为单行DataFrame

7

我看到了类似的问题,但我的问题更直接、抽象。

我有一个包含“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中,最符合习惯的方法是什么?
4个回答

11

让我们试试使用 stackto_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

这是@Wen发布的内容,对吗?除了增加索引之外 - Bharath M Shetty
1
@Dark 没有交换级别 :) - Scott Boston
我错过了那个,尽管我从你那里学到了列映射,你得到了我的支持 ;) - Bharath M Shetty
很适合这个,:-) - BENY

6

解压并映射,即

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)

5
我们需要 stackswaplevel
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

我想到了unstack,而你选择了stack ;) - Bharath M Shetty
1
@Dark 哈哈,差不多一样,甚至我们可以融合 :-) - BENY
非常感谢,整洁无比。 - user3635284

2

使用列表推导的另一种方式 -

最初的回答

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]

你的回答写得很糟糕。但是,这是唯一一个拥有我所需内容 DataFrame().T 的答案。那个 .T 就是我需要在我的情况下添加的全部,因为我已经有了一个扁平化的 numpy 向量数组。 - Prasad Raghavendra

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