【问题标题】:Get rows corresponding to the minimum with pandas groupby使用 pandas groupby 获取与最小值对应的行
【发布时间】:2019-06-06 22:51:32
【问题描述】:

我有一张表需要按条件分组:

R_num ORG name level
13    Dm   Ad   17
13    Dm   Af   16

当我使用它时,它会给我13 Dm Ad 16,这就像被操纵的数据。

df1=df.reset_index().groupby(['R_num','ORG']).agg({'name':'first','level':['min']})

我想要的结果是13 Dm Af 16,我知道'name':'first' 可能有问题,但请问我该如何解决?

谢谢

【问题讨论】:

  • 是的,这是我的原始代码,但 reset_index 与不匹配结果无关。

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:

IIUC,你应该使用groupbyidxmin

# df.loc[df.groupby(['R_num','ORG'])['level'].agg('idxmin')]
df.loc[df.groupby(['R_num','ORG'])['level'].idxmin()]

   R_num ORG name  level
1     13  Dm   Af     16

【讨论】:

  • 噗。我很接近,但我的语法不正确:df.groupby(['R_num','ORG']).apply(pd.DataFrame.__getitem__, 'level').apply(pd.DataFrame.idxmin)。当您像上面那样索引GroupBy 对象时(即使用['level']),是否会返回一个普通的Series
  • @tel 是的,它返回一个以 grouper 键为索引的系列。
  • 找到一个 alt :-)
【解决方案2】:

sort_values 之后使用drop_duplicates

newdf = df.sort_values('level').drop_duplicates(['R_num','ORG'])
newdf
   R_num ORG name  level
1     13  Dm   Af     16

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 2021-08-26
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多