假设我有以下数据,可以是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)
答案 0 :(得分:3)
在pandas中,可以通过执行groupby
然后在第1列调用min()
来完成,此处我的df具有列名0
和1
,然后我调用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