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

时间:2015-02-11 14:51:19

标签: python numpy pandas

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

输出如下所示:

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

1 个答案:

答案 0 :(得分:3)

在pandas中,可以通过执行groupby然后在第1列调用min()来完成,此处我的df具有列名01,然后我调用reset_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