Reputation: 1
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
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
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