在Python Pandas中将列转换为行

29

我有以下Python pandas数据框:

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

我想要:

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

我已经查看了pivot()、pivot_table()、Transpose和unstack(),但似乎都不能给我想要的结果。因为我是Pandas的新手,所以非常需要帮助。


1
如果你对性能的差异感兴趣,可以查看这个问题:链接 - jezrael
3个回答

28

你需要使用set_index函数,并结合T进行转置:

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

如果需要重命名列,这有点复杂:
print (df.rename(columns={'numFruits':'Market 1 Order'})
         .set_index('fruits')
         .rename_axis(None).T)
                apples  grapes  figs
Market 1 Order      10      20    15

另一种更快的解决方案是使用 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

时间

#[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

嗨...在这个问题中只有3列,如果我们有10列并且需要保留其中8列,只使用其他2列来重新塑造数据怎么办? - yasin mohammed
看起来你需要 pivot_table,但是没有数据很难回答。也许最好的方法是创建一个带有样本数据、期望输出和你尝试过的代码的新问题。 - jezrael
我刚刚创建了一个新问题,请审核。 - yasin mohammed

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

                apples  grapes  figs
Market 1 Order      10      20    15

请参考jezrael提出的改进。 df.numFruits.values.reshape(1, -1) 更加高效。


@jezrael 那是我做事粗心。Pandas需要花费额外的时间来弄清楚我有一个数组列表。像你一样一开始就给它一个二维数组会简单得多。 - piRSquared
@jezrael 概念是一样的。我会编辑我的答案,指向你对它的更新。 - piRSquared
@jezrael,我认为对于更大的数组来说,开销很小... - piRSquared
我有点困惑,但现在我觉得非常好了。谢谢。 - jezrael
@jezrael 不对!我错了...对于更大的数组,情况甚至更糟。 - piRSquared
1
我新建了一个关于解释的问题,希望你能得到一个好答案;) - jezrael

1
您可以使用Pandas的transpose API,如下所示:

df.transpose()

将df视为您的Pandas数据帧


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