Pandas GroupBy 并选择特定列中具有最小值的行

新手上路,请多包涵

我有一个包含 A、B 和 C 列的 DataFrame。对于 A 的每个值,我想选择 B 列中具有最小值的行。

也就是说,从这个:

 df = pd.DataFrame({'A': [1, 1, 1, 2, 2, 2],
                   'B': [4, 5, 2, 7, 4, 6],
                   'C': [3, 4, 10, 2, 4, 6]})
    A   B   C
0   1   4   3
1   1   5   4
2   1   2   10
3   2   7   2
4   2   4   4
5   2   6   6

我想得到:

     A   B   C
0   1   2   10
1   2   4   4

目前,我按 A 列分组,然后创建一个值,向我指示我将保留的行:

 a = data.groupby('A').min()
a['A'] = a.index
to_keep = [str(x[0]) + str(x[1]) for x in a[['A', 'B']].values]
data['id'] = data['A'].astype(str) + data['B'].astype('str')
data[data['id'].isin(to_keep)]

我相信有一种更直接的方法可以做到这一点。我在这里看到许多使用 MultiIndex 的答案,我宁愿避免使用它。

谢谢您的帮助。

原文由 Wendy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 802
2 个回答

我觉得你想多了。只需使用 groupbyidxmin

 df.loc[df.groupby('A').B.idxmin()]

   A  B   C
2  1  2  10
4  2  4   4


 df.loc[df.groupby('A').B.idxmin()].reset_index(drop=True)

   A  B   C
0  1  2  10
1  2  4   4

原文由 cs95 发布,翻译遵循 CC BY-SA 4.0 许可协议

有类似的情况,但列标题更复杂 (例如“B val”) ,在这种情况下需要这样做:

 df.loc[df.groupby('A')['B val'].idxmin()]

原文由 Juho 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题