分组取最大值,而忽略当前行的值

时间:2019-04-17 09:05:23

标签: python pandas max

我想计算一组中的最大值,但不使用行本身的值。

因此,如果我们有一个像这样的数据框:

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)。

1 个答案:

答案 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()来查看条件匹配的地方和不匹配的地方,并相应地进行映射。