Groupby 名称将值替换为所有列中的最大值 pandas

Aja*_*nni 6 python python-3.x pandas pandas-groupby

我有这个数据帧

lst = [['AAA',15,'BBB',20],['BBB',16,'AAA',12],['BBB',22,'CCC',15],['CCC',11,'AAA',31],['DDD',25,'EEE',35]]
df = pd.DataFrame(lst,columns = ['name1','val1','name2','val2'])
Run Code Online (Sandbox Code Playgroud)

看起来像这样

 name1   val1 name2 val2
0  AAA     15  BBB   20
1  BBB     16  AAA   12
2  BBB     22  CCC   15
3  CCC     11  AAA   31
4  DDD     25  EEE   35
Run Code Online (Sandbox Code Playgroud)

我要这个

 name1   val1 name2  val2
0  AAA     31  BBB    22
1  BBB     22  AAA    31
2  BBB     22  CCC    15
3  CCC     15  AAA    31
4  DDD     25  EEE    35
Run Code Online (Sandbox Code Playgroud)

用最大值替换所有值。我们从两者中选择最大值val1val2

如果我这样做,我将获得最大值 val1

df["val1"] = df.groupby("name1")["val1"].transform("max")
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 8

尝试使用pd.wide_to_long将该数据帧融合为一个长格式,然后使用 groupby 和 transform 来查找最大值。将该最大值映射到“名称”并将其重塑回四列(宽)数据框:

df_long = pd.wide_to_long(df.reset_index(), ['name','val'], 'index', j='num',sep='',suffix='\d+')
mapper= df_long.groupby('name')['val'].max()
df_long['val'] = df_long['name'].map(mapper)
df_new = df_long.unstack()
df_new.columns = [f'{i}{j}' for i,j in df_new.columns]
df_new
Run Code Online (Sandbox Code Playgroud)

输出:

      name1 name2  val1  val2
index                        
0       AAA   BBB    31    22
1       BBB   AAA    22    31
2       BBB   CCC    22    15
3       CCC   AAA    15    31
4       DDD   EEE    25    35
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 8

借用 Scott 的设置

df_long = pd.wide_to_long(df.reset_index(), ['name','val'], 'index', j='num',sep='',suffix='\d+')
d = df_long.groupby('name')['val'].max()

df.loc[:,df.columns.str.startswith('val')]=df.loc[:,df.columns.str.startswith('name')].replace(d).values
df
Out[196]: 
  name1  val1 name2  val2
0   AAA    31   BBB    22
1   BBB    22   AAA    31
2   BBB    22   CCC    15
3   CCC    15   AAA    31
4   DDD    25   EEE    35
Run Code Online (Sandbox Code Playgroud)


ALo*_*llz 5

您可以使用lreshape(关于它是否经过测试或将继续保留没有记录和模棱两可)来获取长数据帧,然后使用最大值映射每对列。

names = df.columns[df.columns.str.startswith('name')]
vals = df.columns[df.columns.str.startswith('val')]

s = (pd.lreshape(df, groups={'name': names, 'val': vals})
       .groupby('name')['val'].max())

for n in names:
    df[n.replace('name', 'val')] = df[n].map(s)
Run Code Online (Sandbox Code Playgroud)
  name1  val1 name2  val2
0   AAA    31   BBB    22
1   BBB    22   AAA    31
2   BBB    22   CCC    15
3   CCC    15   AAA    31
4   DDD    25   EEE    35
Run Code Online (Sandbox Code Playgroud)