Groupby用那里的最大值熊猫替换值

时间:2020-08-13 06:41:11

标签: python python-3.x pandas

我有这个DataFrame

lst = [['AAA',15],['BBB',16],['BBB',22],['AAA',20],['CCC',11],['AAA',10]]
df = pd.DataFrame(lst,columns = ['name','val'])

看起来像这样

  name  val
0  AAA   15
1  BBB   16
2  BBB   22
3  AAA   20
4  CCC   11
5  AAA   10

我想要这个

  name  val
0  AAA   20
1  BBB   22
2  BBB   22
3  AAA   20
4  CCC   11
5  AAA   20

将所有val替换为该name组中的最大值

到目前为止,我做到了

dd = df.groupby('name')['val'].max().to_dict()

这将为我提供所有最大val的字典,现在我必须使用此字典替换它们。

如果我在此之后执行此操作,则会将所有name替换为val,但我想根据那里的val替换所有name

df.replace({"name": dd}) 

2 个答案:

答案 0 :(得分:3)

lst = [['AAA',15],['BBB',16],['BBB',22],['AAA',20],['CCC',11],['AAA',10]]
df = pd.DataFrame(lst,columns = ['name','val'])

max = df.groupby('name').max()
df=df.merge(max,on='name')
del df['val_x']

print(df)
  name  val_y
0  AAA     20
1  AAA     20
2  AAA     20
3  BBB     22
4  BBB     22
5  CCC     11

答案 1 :(得分:3)

如果您希望/需要翻阅字典,可以DataFrame.apply()进行修改的功能:

import pandas as pd
lst = [['AAA',15],['BBB',16],['BBB',22],['AAA',20],['CCC',11],['AAA',10]]
df = pd.DataFrame(lst,columns = ['name','val'])    
dd = df.groupby('name')['val'].max().to_dict()
df["val"] = df["name"].apply(lambda d: dd[d])

print (df)

Ch3steR在评论中指出

df["val"] = df["name"].map(dd)

看起来更聪明。参见Series.map()

输出:

  name  val
0  AAA   20
1  BBB   22
2  BBB   22
3  AAA   20
4  CCC   11
5  AAA   20
相关问题