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
TA贡献1829条经验 获得超13个赞
有类似的情况,但列标题更复杂(例如“B val”),在这种情况下需要这样做:
df.loc[df.groupby('A')['B val'].idxmin()]
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
我已经在非常大的数据集上对其进行了测试,这是我可以在合理的时间内使其工作的唯一方法。
添加回答
举报