Python numpy数组或数据帧中的条件筛选

Python numpy数组或数据帧中的条件筛选,python,numpy,pandas,Python,Numpy,Pandas,假设我有以下数据,可以是numpyarray或pandasDataFrame: array([[4092, 3], [4095, 4], [4097, 4], [4124, 1], [4128, 0], [4129, 0], [4131, 5], [4132, 5], [4133, 2], [4134, 2]],

假设我有以下数据,可以是
numpy
array或
pandas
DataFrame:

array([[4092,    3],
       [4095,    4],
       [4097,    4],
       [4124,    1],
       [4128,    0],
       [4129,    0],
       [4131,    5],
       [4132,    5],
       [4133,    2],
       [4134,    2]], dtype=int64)
我想得到一个数组,其中包含每个类别中的最小值(第2列)。我可以在每个唯一的值上循环执行min操作并存储结果,但我想知道是否有一种更快更干净的方法来实现这一点

输出如下所示:

array([[4092,    3],
       [4095,    4],
       [4124,    1],
       [4128,    0],
       [4131,    5],
       [4133,    2]], dtype=int64)

在pandas中,可以通过执行
groupby
,然后在第1列上调用
min()
,在这里我的df具有列名
0
1
,然后调用
reset\u index
,将分组索引恢复为列,由于现在的顺序有点混乱,我使用
ix
和“奇特的索引”来获得您想要的顺序:

In [22]:

result = df.groupby(1)[0].min().reset_index()
result.ix[:,[0,1]]
Out[22]:
      0  1
0  4128  0
1  4124  1
2  4133  2
3  4092  3
4  4095  4
5  4131  5
上述方法是矢量化的,因此它们将比在每一行上迭代快得多,伸缩性也更好

我使用以下代码创建了数据帧:

In [4]:

import numpy as np
a = np.array([[4092,    3],
       [4095,    4],
       [4097,    4],
       [4124,    1],
       [4128,    0],
       [4129,    0],
       [4131,    5],
       [4132,    5],
       [4133,    2],
       [4134,    2]], dtype=np.int64)
a
Out[4]:
array([[4092,    3],
       [4095,    4],
       [4097,    4],
       [4124,    1],
       [4128,    0],
       [4129,    0],
       [4131,    5],
       [4132,    5],
       [4133,    2],
       [4134,    2]], dtype=int64)

In [23]:

import pandas as pd
df = pd.DataFrame(a)
df
Out[23]:
      0  1
0  4092  3
1  4095  4
2  4097  4
3  4124  1
4  4128  0
5  4129  0
6  4131  5
7  4132  5
8  4133  2
9  4134  2

@Ffisegydd我认为你是对的,我将删除并思考一下,谢谢你指出这个outPerfect!我会在一分钟内接受。非常感谢@谢谢!我已经更新了问题。