我按A列对数据集进行分组,然后希望在B列中取最小值,在C列中取相应的值。
data = pd.DataFrame({'A': [1, 2], 'B':[ 2, 4], 'C':[10, 4]})
data
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)]
我相信有一种更直接的方法可以做到这一点。我在这里看到了许多使用多索引的答案,但我希望在不向我的数据框架添加多索引的情况下这样做。谢谢你的帮助。
发布于 2019-02-01 00:04:00
我觉得你想太多了。只需使用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
发布于 2019-12-15 10:50:14
有类似的情况,但具有更复杂的列标题(例如"B val"),在这种情况下需要这样:
df.loc[df.groupby('A')['B val'].idxmin()]
发布于 2021-09-23 15:25:51
我找到了一个更冗长的答案,但更有效的
以下是示例数据集:
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
我已经在非常大的数据集上对它进行了测试,这是我能够在合理的时间内使其工作的唯一方法。
https://stackoverflow.com/questions/54470917
复制相似问题