簡體   English   中英

如何根據 pandas.groupby().max() 中一列的最大值獲取整行?

[英]How to get the whole row based on a max value from one column in pandas.groupby().max()?

我想指定我需要獲取整行的最大值,而不是來自多行的不同最大值,在我的示例中,這應該基於“數字”列。 比如這種方式:

import pandas as pd

data = {
    'Number':[12,55,3,2,88,17],
    'People':['Zack','Zack','Merry','Merry','Cross','Cross'],
    'Random':[353,0.5454,0.5454336,32,-7,4]
}

df = pd.DataFrame (data, columns = ['Number','People','Random'])

print(df,'\n')

max_values = df.groupby('People').max()

print(max_values)

結果如下:

   Number People      Random
0      12   Zack  353.000000
1      55   Zack    0.545400
2       3  Merry    0.545434
3       2  Merry   32.000000
4      88  Cross   -7.000000
5      17  Cross    4.000000 

        Number  Random
People                
Cross       88     4.0
Merry        3    32.0
Zack        55   353.0

這是max_values的預期結果:

        Number  Random
People                
Cross       88    -7.000000
Merry        3    0.545434
Zack        55   353.0

您可以執行以下操作:

import pandas as pd

data = {
    'Number':[12,55,3,2,88,17],
    'People':['Zack','Zack','Merry','Merry','Cross','Cross'],
    'Random':[353,0.5454,0.5454336,32,-7,4]
}

df = pd.DataFrame (data, columns = ['Number','People','Random'])

print(df,'\n')

res = df[df.groupby(['People'])['Number'].transform(max) == df['Number']].set_index('People')
print(res)

這給出了以下 output:

        Number    Random
People                  
Zack        55  0.545400
Merry        3  0.545434
Cross       88 -7.000000

您的代碼中的問題是每列都應用max() ,因此通過使用切片可以避免此問題。

注意問題中預期的output是一個錯誤

你可以試試這樣的 -

df['max_number'] = df.groupby(['People'])['Number'].transform(max)
df[df.Number == df.max_number].drop('max_number', axis=1).set_index('People')

         Number Random
People                  
Zack        55  0.545400
Merry        3  0.545434
Cross       88 -7.000000

恕我直言,這是更直接的方法。

df.sort_values('Number').groupby('People').tail(1)

(也許還將您的列名更改為“名稱”)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM