为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2021-10-26 16:08:00
我按 A 列对我的数据集进行分组,然后想取 B 列中的最小值和 C 列中的相应值。data = pd.DataFrame({'A': [1, 2], 'B':[ 2, 4], 'C':[10, 4]})data      A   B   C0   1   4   31   1   5   42   1   2   103   2   7   24   2   4   45   2   6   6  我想得到:    A   B   C0   1   2   101   2   4   4目前我按 A 分组,并创建一个值来指示我将保留在我的数据集中的行:a = data.groupby('A').min()a['A'] = a.indexto_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)]我相信有一种更直接的方法可以做到这一点。我在这里看到了很多使用多索引的答案,但我想这样做而不向我的数据帧添加多索引。感谢您的帮助。
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

感觉你多虑了 只需使用groupby和idxmin:


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


查看完整回答
反对 回复 2021-10-26
?
烙印99

TA贡献1829条经验 获得超13个赞

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

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


查看完整回答
反对 回复 2021-10-26
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

我发现一个答案有点罗嗦,但效率更高:


这是示例数据集:


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

data


Out:

   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 

首先,我们将从 groupby 操作中获取系列的最小值:


min_value = data.groupby('A').B.min()

min_value


Out:

A

1    2

2    4

Name: B, dtype: int64

然后,我们在原始数据框上合并这个系列结果


data = data.merge(min_value, on='A',suffixes=('', '_min'))

data


Out:

   A  B   C  B_min

0  1  4   3      2

1  1  5   4      2

2  1  2  10      2

3  2  7   2      4

4  2  4   4      4

5  2  6   6      4

最后,我们只得到 B 等于 B_min 的行并删除 B_min 因为我们不再需要它了。


data = data[data.B==data.B_min].drop('B_min', axis=1)

data


Out:

   A  B   C

2  1  2  10

4  2  4   4

我已经在非常大的数据集上对其进行了测试,这是我可以在合理的时间内使其工作的唯一方法。


查看完整回答
反对 回复 2021-10-26
  • 3 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信