簡體   English   中英

pandas df獲取與groupby的max相關聯的列的值

[英]pandas df getting the value of a column associated with the max of a groupby

我試圖通過A組合,找到B的最大值,並且最大值返回與之關聯的C.

import pandas as pd

a1 = [1,2,'x']
a2 = [1,3,'y']
a3 = [2,3,'y']
a4 = [2,4,'z']

df = pd.DataFrame([a1,a2,a3,a4], columns = ['A','B','C'])

groups = df.groupby('A')['B'].max()

df = df.join(groups, on='A', rsuffix = '_max')

df

我得到的結果是

   A  B  C  B_max
0  1  2  x      3
1  1  3  y      3
2  2  3  y      4
3  2  4  z      4

我想要的結果是

   A  B  C  B_max  C_max
0  1  2  x      3      y
1  1  3  y      3      y
2  2  3  y      4      z
3  2  4  z      4      z

那么這里有幾個選項(毫無疑問還有更多)。 (1)這是一個剛上你在做什么(它抓住通過使用該C_max列皺紋idxmax B柱):

>>> foo = lambda x: pd.Series({'B_max':x.B.max(),'C_max':x.C[x.B.idxmax()]}) 
>>> print df.join(df.groupby('A').apply(foo),on='A')

  A  B  C  B_max C_max
0  1  2  x      3     y
1  1  3  y      3     y
2  2  3  y      4     z
3  2  4  z      4     z

(2)或者這可能更清潔:

>>> agg = df.groupby('A').agg(lambda x: x.loc[x.B.idxmax(),:])
>>> print df.join(agg, on='A', rsuffix = '_max')

   A  B  C  B_max C_max
0  1  2  x      3     y
1  1  3  y      3     y
2  2  3  y      4     z
3  2  4  z      4     z

(3)或者你可以在groupby/apply調用的函數中完成所有操作:

def foo(g):
    g['B_max'] = g.B.max()
    g['C_max'] = g.C[g.B.idxmax()]
    return g

print df.groupby('A').apply(foo)

   A  B  C  B_max C_max
0  1  2  x      3     y
1  1  3  y      3     y
2  2  3  y      4     z
3  2  4  z      4     z

暫無
暫無

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

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