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 有列名 0
和 1
,然后我调用 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
假设我有以下数据,可以是 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 有列名 0
和 1
,然后我调用 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