Cedoche
Cedoche

Reputation: 1

Reshape dataframe by reversing columns names with columns values

I am trying to reshape a df so that the values become columns and the current columns' names become the values of the new df.

Here is an exemple.

df1=pd.DataFrame(data=[['v1','v2','v3'],['v4','v3','v1'],[np.nan,'v2','v1'],['v5','v3','v6'],], columns=['A','B','C'], index=['d1','d2','d3','d4'])
df1.index.names=['Day']
df1 # What I have
Out[1]: 
       A   B   C
Day             
d1    v1  v2  v3
d2    v4  v3  v1
d3   NaN  v2  v1
d4    v5  v3  v6
df2=pd.DataFrame(data=[['A','B','C',np.nan,np.nan,np.nan],['C',np.nan,'B','A',np.nan,np.nan],['C','B',np.nan,np.nan,np.nan,np.nan],[np.nan,np.nan,'B',np.nan,'A','C']], columns=['v1','v2','v3','v4','v5','v6'], index=['d1','d2','d3','d4'])
df2.index.names=['Day']
df2 # Desired output
Out[2]: 
     v1   v2   v3   v4   v5   v6
d1    A    B    C  NaN  NaN  NaN
d2    C  NaN    B    A  NaN  NaN
d3    C    B  NaN  NaN  NaN  NaN
d4  NaN  NaN    B  NaN    A    C

I guess something with stack(), unstack() or pivot()?

Upvotes: 0

Views: 48

Answers (2)

sammywemmy
sammywemmy

Reputation: 28709

You could use a combination of melt and pivot :

(
    df1.melt(ignore_index=False)
    .dropna()
    .pivot(columns="value", values="variable")
    .rename_axis(columns=None)
)

    v1  v2  v3  v4  v5  v6
Day                     
d1  A   B   C   NaN NaN NaN
d2  C   NaN B   A   NaN NaN
d3  C   B   NaN NaN NaN NaN
d4  NaN NaN B   NaN A   C

Upvotes: 0

Scott Boston
Scott Boston

Reputation: 153500

Try, stack then pivot:

df1a = df1.stack().reset_index()
df1a.pivot('Day', 0, 'level_1')

Output:

0     v1   v2   v3   v4   v5   v6
Day                              
d1     A    B    C  NaN  NaN  NaN
d2     C  NaN    B    A  NaN  NaN
d3     C    B  NaN  NaN  NaN  NaN
d4   NaN  NaN    B  NaN    A    C

and reset_index:

df1a.pivot('Day', 0, 'level_1').reset_index()

Output:

0 Day   v1   v2   v3   v4   v5   v6
0  d1    A    B    C  NaN  NaN  NaN
1  d2    C  NaN    B    A  NaN  NaN
2  d3    C    B  NaN  NaN  NaN  NaN
3  d4  NaN  NaN    B  NaN    A    C

Upvotes: 2

Related Questions