分组时保留其他列

发布于 2021-01-29 17:56:21

我在groupbypandas数据框上使用来删除没有特定列的最小值的所有行。像这样:

df1 = df.groupby("item", as_index=False)["diff"].min()

但是,如果我不止这两列,其他列(例如otherstuff在我的示例中)将被删除。我可以使用保留这些列groupby,还是必须找到一种不同的方式删除行?

我的数据如下:

    item    diff   otherstuff
   0   1       2            1
   1   1       1            2
   2   1       3            7
   3   2      -1            0
   4   2       1            3
   5   2       4            9
   6   2      -6            2
   7   3       0            0
   8   3       2            9

并应以如下形式结束:

    item   diff  otherstuff
   0   1      1           2
   1   2     -6           2
   2   3      0           0

但是我得到的是:

    item   diff
   0   1      1           
   1   2     -6           
   2   3      0

我一直在浏览文档,找不到任何东西。我试过了:

df1 = df.groupby(["item", "otherstuff"], as_index=false)["diff"].min()

df1 = df.groupby("item", as_index=false)["diff"].min()["otherstuff"]

df1 = df.groupby("item", as_index=false)["otherstuff", "diff"].min()

但是这些都不起作用(我在最后一个中意识到,语法是在创建组后进行聚合的)。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    方法1:使用idxmin()来获取minimum元素的 索引diff,然后选择那些元素:

    >>> df.loc[df.groupby("item")["diff"].idxmin()]
       item  diff  otherstuff
    1     1     1           2
    6     2    -6           2
    7     3     0           0
    
    [3 rows x 3 columns]
    

    方法2:按排序diff,然后取每组中的第一个元素item

    >>> df.sort_values("diff").groupby("item", as_index=False).first()
       item  diff  otherstuff
    0     1     1           2
    1     2    -6           2
    2     3     0           0
    
    [3 rows x 3 columns]
    

    请注意,即使行内容相同,结果索引也不同。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看