numpy 数组或 pandas DataFrame 中的条件过滤

Conditional filtering in numpy arrays or pandas DataFrame

假设我有以下数据,可以是 numpy 数组或 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 列)中的最小值。我可以遍历每个唯一值执行最小操作并存储结果,但我想知道是否有更快更简洁的方法来做到这一点。

输出如下所示:

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

在 pandas 中,它将通过执行 groupby 然后在第一列上调用 min() 来完成,这里我的 df 有列名 01,然后我调用 reset_index 将分组索引恢复为列,因为排序现在有点混乱我使用 ix 和 'fancy indexing' 来获得你想要的顺序:

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