I have this DataFrame
JavaScript
x
3
1
lst = [['AAA',15,'BBB',20],['BBB',16,'AAA',12],['BBB',22,'CCC',15],['CCC',11,'AAA',31],['DDD',25,'EEE',35]]
2
df = pd.DataFrame(lst,columns = ['name1','val1','name2','val2'])
3
which looks like this
JavaScript
1
7
1
name1 val1 name2 val2
2
0 AAA 15 BBB 20
3
1 BBB 16 AAA 12
4
2 BBB 22 CCC 15
5
3 CCC 11 AAA 31
6
4 DDD 25 EEE 35
7
I want this
JavaScript
1
7
1
name1 val1 name2 val2
2
0 AAA 31 BBB 22
3
1 BBB 22 AAA 31
4
2 BBB 22 CCC 15
5
3 CCC 15 AAA 31
6
4 DDD 25 EEE 35
7
replaced all values with the maximum value. we choose the maximum value from both val1
and val2
if i do this i will get the maximum from only val1
JavaScript
1
2
1
df["val1"] = df.groupby("name1")["val1"].transform("max")
2
Advertisement
Answer
Try using pd.wide_to_long
to melt that dataframe into a long form, then use groupby with transform to find the max value. Map that max value to ‘name’ and reshape back to four column (wide) dataframe:
JavaScript
1
7
1
df_long = pd.wide_to_long(df.reset_index(), ['name','val'], 'index', j='num',sep='',suffix='d+')
2
mapper= df_long.groupby('name')['val'].max()
3
df_long['val'] = df_long['name'].map(mapper)
4
df_new = df_long.unstack()
5
df_new.columns = [f'{i}{j}' for i,j in df_new.columns]
6
df_new
7
Output:
JavaScript
1
8
1
name1 name2 val1 val2
2
index
3
0 AAA BBB 31 22
4
1 BBB AAA 22 31
5
2 BBB CCC 22 15
6
3 CCC AAA 15 31
7
4 DDD EEE 25 35
8