Python 基于变量值查找数据帧中的最大值

Python 基于变量值查找数据帧中的最大值,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个如下形式的数据框: A| B| C | D a| x| r | 1 a| x| s | 2 a| y| r | 1 b| w| t | 4 b| z| v | 2 我希望能够返回如下内容(显示唯一值和频率) 目前,我可以快速计算结果数据帧的3列以外的所有内容 df = (df.groupby('A', sort=False)['B'] .apply(lambda x: x.value_counts().head(1)) .reset_index() 但是为了计算2列(

我有一个如下形式的数据框:

A| B| C | D
a| x| r | 1
a| x| s | 2
a| y| r | 1
b| w| t | 4
b| z| v | 2
我希望能够返回如下内容(显示唯一值和频率)

目前,我可以快速计算结果数据帧的3列以外的所有内容

df = (df.groupby('A', sort=False)['B']
    .apply(lambda x: x.value_counts().head(1))
    .reset_index()
但是为了计算2列(“根据B列中最常见的值计算D列的最大值”),我写了一个for循环,它对于很多数据来说都很慢。 有捷径吗

该问题链接到:

使用“按最大值获取行数”
D
按以下方式分组:


考虑分3个步骤执行此操作:

  • 查找最常见的B(如代码中所示):
  • df2=(df.groupby('A',sort=False)['B'])。应用(lambda x:x.value_counts().head(1))。重置_index()

  • 为A和B的每个组合构建最大D的数据帧
  • df3=df.groupby(['A','B']).agg({'D':max}).reset_index()

  • 合并2个数据帧以查找与先前选择的A-B对匹配的最大Ds
  • df2.merge(df3,左上=['A','level\u 1'],右上=['A','B'])

    结果数据框中的D列将是您所需要的

       A level_1  B_x B_y  D
    0  a       x    2   x  2
    1  b       w    1   w  4
    
    在loc()中很好地使用了idxmax()。我喜欢这个解决方案!
    df1 = (df.groupby('A', sort=False)['B']
            .apply(lambda x: x.value_counts().head(1))
            .reset_index()
            .rename(columns={'level_1':'E'}))
    #print (df1)
    
    df = df1.merge(df, left_on=['A','E'], right_on=['A','B'], suffixes=('','_'))
    df = df.loc[df.groupby('A')['D'].idxmax(), ['A','B','D','E']]
    print (df)
       A  B  D  E
    1  a  2  2  x
    2  b  1  4  w
    
       A level_1  B_x B_y  D
    0  a       x    2   x  2
    1  b       w    1   w  4