Let’s say I have a dataframe (df) that looks like this(dots indicate more columns):
<code>Type Price1 Price2 Price3 Price4 Price5 ... ...
A nan 1 nan nan 2
A nan 3 nan nan 2
B nan nan 4 5 nan
B nan nan 6 7 nan
C nan 2 nan nan 1
C nan 4 nan nan 3
D 1 8 nan nan nan
D 9 6 nan nan nan
</code>
<code>Type Price1 Price2 Price3 Price4 Price5 ... ...
A nan 1 nan nan 2
A nan 3 nan nan 2
B nan nan 4 5 nan
B nan nan 6 7 nan
C nan 2 nan nan 1
C nan 4 nan nan 3
D 1 8 nan nan nan
D 9 6 nan nan nan
</code>
Type Price1 Price2 Price3 Price4 Price5 ... ...
A nan 1 nan nan 2
A nan 3 nan nan 2
B nan nan 4 5 nan
B nan nan 6 7 nan
C nan 2 nan nan 1
C nan 4 nan nan 3
D 1 8 nan nan nan
D 9 6 nan nan nan
I need to transform this dataframe to look like this:
<code>Type newcol1 newcol2 ... ...
A 2 1
A 2 3
B 4 5
B 6 7
C 1 2
C 3 4
D 1 8
D 9 6
</code>
<code>Type newcol1 newcol2 ... ...
A 2 1
A 2 3
B 4 5
B 6 7
C 1 2
C 3 4
D 1 8
D 9 6
</code>
Type newcol1 newcol2 ... ...
A 2 1
A 2 3
B 4 5
B 6 7
C 1 2
C 3 4
D 1 8
D 9 6
These are the criteria for selecting which columns get which values:
<code>if type == 'A'
'Price5' -> 'newcol1' && 'Price2' -> 'newcol2'
</code>
<code>if type == 'A'
'Price5' -> 'newcol1' && 'Price2' -> 'newcol2'
</code>
if type == 'A'
'Price5' -> 'newcol1' && 'Price2' -> 'newcol2'
<code>if type == 'B'
'Price3' -> 'newcol1' && 'Price4' -> 'newcol2'
</code>
<code>if type == 'B'
'Price3' -> 'newcol1' && 'Price4' -> 'newcol2'
</code>
if type == 'B'
'Price3' -> 'newcol1' && 'Price4' -> 'newcol2'
<code>if type == 'C'
'Price5' -> 'newcol1' && 'Price2' -> 'newcol2'
</code>
<code>if type == 'C'
'Price5' -> 'newcol1' && 'Price2' -> 'newcol2'
</code>
if type == 'C'
'Price5' -> 'newcol1' && 'Price2' -> 'newcol2'
<code>if type == 'D'
'Price1' -> 'newcol1' && 'Price2' -> 'newcol2'
</code>
<code>if type == 'D'
'Price1' -> 'newcol1' && 'Price2' -> 'newcol2'
</code>
if type == 'D'
'Price1' -> 'newcol1' && 'Price2' -> 'newcol2'
My logic was to use the mask function to achieve this, and assign the values to 2 columns then just rename them, which works but I am handling every case seperately and is kind of messy:
<code>df = df.mask(df['Type'].eq('A'), df.assign(**{'Price3': df['Price5'].values, 'Price4': df['Price2'].values}))
df.rename(columns = {'Price3':'newcol1'}, inplace = True)
df.rename(columns = {'Price4':'newcol2'}, inplace = True)
</code>
<code>df = df.mask(df['Type'].eq('A'), df.assign(**{'Price3': df['Price5'].values, 'Price4': df['Price2'].values}))
df.rename(columns = {'Price3':'newcol1'}, inplace = True)
df.rename(columns = {'Price4':'newcol2'}, inplace = True)
</code>
df = df.mask(df['Type'].eq('A'), df.assign(**{'Price3': df['Price5'].values, 'Price4': df['Price2'].values}))
df.rename(columns = {'Price3':'newcol1'}, inplace = True)
df.rename(columns = {'Price4':'newcol2'}, inplace = True)
How could I achieve this in a more efficient manner?