In Pandas, I have the following data frame:
id1 id2 t1 l1 t2 l2 0 1 2 a b c d 1 3 4 g h i j
I would like to melt two columns at once. That is, the desired output is:
id1 id2 tz lz 0 1 2 a b 1 1 2 c d 2 3 4 g h 3 3 4 i j
I know standard melting:
d.melt(id_vars=['id1', 'id2'],
value_vars=['t1', 't2', 'l1', 'l2'])
but that stacks all columns
id1 id2 variable value 0 1 2 t1 a 1 3 4 t1 g 2 1 2 t2 c 3 3 4 t2 i 4 1 2 l1 b 5 3 4 l1 h 6 1 2 l2 d 7 3 4 l2 j
How could I melt two columns at once? Something like:
d.melt(id_vars=['id1', 'id2'],
value_vars={('t1', 'l1'): 'tz', ('t2', 'l2'): 'lz'})
would be great.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
This is wide_to_long
pd.wide_to_long(df,['t','l'],i=['id1','id2'],j='drop').reset_index(level=[0,1])
Out[52]:
id1 id2 t l
drop
1 1 2 a b
2 1 2 c d
1 3 4 g h
2 3 4 i j
Method 2
You can use melt twice here and after that concat them to get desired output:
t = d.melt(id_vars=['id1', 'id2'], value_vars=['t1', 't2'], value_name='tz').drop('variable', axis=1)
l = d.melt(id_vars=['id1', 'id2'], value_vars=['l1', 'l2'], value_name='lz').iloc[:, -1:]
df = pd.concat([t, l], axis=1).sort_values('id1')
Output
print(df) id1 id2 tz lz 0 1 2 a b 2 1 2 c d 1 3 4 g h 3 3 4 i j
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0