我想计算一组中的最大值,但不使用行本身的值。
因此,如果我们有一个像这样的数据框:
d = {'col1': ["a", "a", "b", "a", "b", "a"], 'col2': [0, 4, 3, -5, -1, 2]}
df = pd.DataFrame(data=d)
print(df)
col1 col2
0 a 0
1 a 4
2 b 3
3 a -5
4 b -1
5 a 2
然后,我想像这样添加一列max_other
:
col1 col2 max_other
0 a 0 4
1 a 4 2
2 b 3 -1
3 a -5 4
4 b -1 3
5 a 2 4
资料来源:这是this问题的后续问题,我问过有关分组计算均值的问题,而忽略了该行自身的值。
编辑:我的max_other
在第1行有一个错误(它说应该为2时为3)。
答案 0 :(得分:1)
您可以尝试:
m=df.groupby('col1')['col2'].transform(lambda x: x.eq(x.max()))
d1=df[~m].groupby('col1')['col2'].max().to_dict()
d2=dict(zip(df.loc[m,'col1'],df.loc[m,'col2']))
df['max_other']=np.where(m,df.col1.map(d1),df.col1.map(d2))
print(df)
col1 col2 max_other
0 a 0 4
1 a 4 2
2 b 3 -1
3 a -5 4
4 b -1 3
5 a 2 4
详细信息: 我们创建一个布尔掩码,以检查该行是否等于该组的最大值:
m=df.groupby('col1')['col2'].transform(lambda x: x.eq(x.max()))
print(m)
0 False
1 True
2 True
3 False
4 False
5 False
我们创建2个字典:
print(d1)
{'a': 2, 'b': -1}
print(d2)
{'a': 4, 'b': 3}
然后我们使用np.where()
来查看条件匹配的地方和不匹配的地方,并相应地进行映射。