在 Python Pandas 中将列转换为行

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/41861846/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 01:45:53  来源:igfitidea点击:

Convert column to row in Python Pandas

pythonpandasdataframetranspose

提问by Reise45

I have the following Python pandas dataframe:

我有以下 Python 熊猫数据框:

     fruits | numFruits
---------------------
0  | apples |   10
1  | grapes |   20
2  |  figs  |   15

I want:

我想要:

                 apples | grapes | figs
-----------------------------------------
Market 1 Order |    10  |   20   |  15

I have looked at pivot(), pivot_table(), Transpose and unstack() and none of them seem to give me this. Pandas newbie, so all help appreciated.

我看过pivot()、pivot_table()、Transpose和unstack(),但似乎没有一个给我这个。熊猫新手,所以感谢所有帮助。

回答by jezrael

You need set_indexwith transpose by T:

您需要set_index通过T以下方式进行转置:

print (df.set_index('fruits').T)
fruits     apples  grapes  figs
numFruits      10      20    15

If need rename columns, it is a bit complicated:

如果需要重命名列,有点复杂:

print (df.rename(columns={'numFruits':'Market 1 Order'})
         .set_index('fruits')
         .rename_axis(None).T)
                apples  grapes  figs
Market 1 Order      10      20    15

Another faster solution is use numpy.ndarray.reshape:

另一个更快的解决方案是使用numpy.ndarray.reshape

print (pd.DataFrame(df.numFruits.values.reshape(1,-1), 
                    index=['Market 1 Order'], 
                    columns=df.fruits.values))

                apples  grapes  figs
Market 1 Order      10      20    15

Timings:

时间

#[30000 rows x 2 columns] 
df = pd.concat([df]*10000).reset_index(drop=True)    
print (df)


In [55]: %timeit (pd.DataFrame([df.numFruits.values], ['Market 1 Order'], df.fruits.values))
1 loop, best of 3: 2.4 s per loop

In [56]: %timeit (pd.DataFrame(df.numFruits.values.reshape(1,-1), index=['Market 1 Order'], columns=df.fruits.values))
The slowest run took 5.64 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 424 μs per loop

In [57]: %timeit (df.rename(columns={'numFruits':'Market 1 Order'}).set_index('fruits').rename_axis(None).T)
100 loops, best of 3: 1.94 ms per loop

回答by piRSquared

pd.DataFrame([df.numFruits.values], ['Market 1 Order'], df.fruits.values)

                apples  grapes  figs
Market 1 Order      10      20    15


Refer to jezrael's enhancement of this concept. df.numFruits.values.reshape(1, -1)is more efficient.

参考 jezrael 对这个概念的增强。 df.numFruits.values.reshape(1, -1)效率更高。

回答by Akash Desarda

You can use transpose api of pandas as follow:

您可以使用熊猫的转置 api 如下:

df.transpose()

Considering df as your pandas dataframe

将 df 视为您的熊猫数据框