Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unmelt Pandas DataFrame

Tags:

python

pandas

I have a pandas dataframe with two id variables:

df = pd.DataFrame({'id': [1,1,1,2,2,3],                 'num': [10,10,12,13,14,15],                'q': ['a', 'b', 'd', 'a', 'b', 'z'],                'v': [2,4,6,8,10,12]})     id  num  q   v 0   1   10  a   2 1   1   10  b   4 2   1   12  d   6 3   2   13  a   8 4   2   14  b  10 5   3   15  z  12 

I can pivot the table with:

df.pivot('id','q','v') 

And end up with something close:

q    a   b   d   z id                 1    2   4   6 NaN 2    8  10 NaN NaN 3  NaN NaN NaN  12 

However, what I really want is (the original unmelted form):

id   num   a   b   d   z                1    10   2   4 NaN NaN 1    12 NaN NaN   6 NaN   2    13   8 NaN NaN NaN 2    14 NaN  10 NaN NaN 3    15 NaN NaN NaN  12 

In other words:

  1. 'id' and 'num' my indices (normally, I've only seen either 'id' or 'num' being the index but I need both since I'm trying to retrieve the original unmelted form)
  2. 'q' are my columns
  3. 'v' are my values in the table

Update

I found a close solution from Wes McKinney's blog:

df.pivot_table(index=['id','num'], columns='q')           v             q        a   b   d   z id num                 1  10    2   4 NaN NaN    12  NaN NaN   6 NaN 2  13    8 NaN NaN NaN    14  NaN  10 NaN NaN 3  15  NaN NaN NaN  12 

However, the format is not quite the same as what I want above.

like image 387
slaw Avatar asked Jul 09 '15 01:07

slaw


People also ask

How do you Unmelt pandas in DF?

We can use pivot() function to unmelt a DataFrame object and get the original dataframe. The pivot() function 'index' parameter value should be same as the 'id_vars' value. The 'columns' value should be passed as the name of the 'variable' column. The unmelted DataFrame values are the same as the original DataFrame.

How do I Unpivot a pandas DataFrame?

In pandas, you can use the melt() function to unpivot a DataFrame – converting it from a wide format to a long format. This function uses the following basic syntax: df_unpivot = pd. melt(df, id_vars='col1', value_vars=['col2', 'col3', ...])

How do you reshape a DataFrame in Python?

You can use the following basic syntax to convert a pandas DataFrame from a wide format to a long format: df = pd. melt(df, id_vars='col1', value_vars=['col2', 'col3', ...]) In this scenario, col1 is the column we use as an identifier and col2, col3, etc.


1 Answers

You could use set_index and unstack

In [18]: df.set_index(['id', 'num', 'q'])['v'].unstack().reset_index() Out[18]: q  id  num    a     b    d     z 0   1   10  2.0   4.0  NaN   NaN 1   1   12  NaN   NaN  6.0   NaN 2   2   13  8.0   NaN  NaN   NaN 3   2   14  NaN  10.0  NaN   NaN 4   3   15  NaN   NaN  NaN  12.0 
like image 101
Zero Avatar answered Sep 29 '22 07:09

Zero