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)
用最大值替换所有值。我们从两者中选择最大值val1
和val2
如果我这样做,我将获得最大值 val1
df["val1"] = df.groupby("name1")["val1"].transform("max")
Run Code Online (Sandbox Code Playgroud)
尝试使用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)
借用 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)
您可以使用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)