Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert column to row in Python Pandas

I have the following Python pandas dataframe:

     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.

like image 550
Reise45 Avatar asked Jan 25 '17 21:01

Reise45


People also ask

How do I change columns to rows in pandas?

Pandas DataFrame. transpose() is a library function that transpose index and columns. The transpose reflects the DataFrame over its main diagonal by writing rows as columns and vice-versa. Use the T attribute or the transpose() method to swap (= transpose) the rows and columns of DataFrame.

How do you convert column values to rows in Python?

Transform using melt() Create a new header year that uses the remaining headers as row values ( var_name ) Create a new header value that uses the remaining row values as row values ( value_name )


2 Answers

You need set_index with transpose by 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:

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 
like image 161
jezrael Avatar answered Sep 28 '22 01:09

jezrael


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.

like image 39
piRSquared Avatar answered Sep 28 '22 02:09

piRSquared