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!我会在一分钟内接受。非常感谢@谢谢!我已经更新了问题。