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.
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.
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 )
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With