Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance pandas数据帧筛选行,如groupby_Performance_Pandas_Numpy_Dataframe - Fatal编程技术网

Performance pandas数据帧筛选行,如groupby

Performance pandas数据帧筛选行,如groupby,performance,pandas,numpy,dataframe,Performance,Pandas,Numpy,Dataframe,例如,我有一个包含以下两列a和b的数据框: 我期望筛选数据帧:[5,6,7,2,3,4,9,0,1] 如果不使用groupby函数,因为使用非常大的数据帧会花费太长的时间,它就是不可用。如何使用col.a中每个组的最后3项进行筛选 您可以先对组的最后一行使用,然后获取以前的索引值,最后通过以下方式进行选择: 方法1:这里有一个基于NumPy的方法- In [89]: a = np.array([1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3]) ...

例如,我有一个包含以下两列a和b的数据框:

我期望筛选数据帧:[5,6,7,2,3,4,9,0,1]

如果不使用groupby函数,因为使用非常大的数据帧会花费太长的时间,它就是不可用。如何使用col.a中每个组的最后3项进行筛选

您可以先对组的最后一行使用,然后获取以前的索引值,最后通过以下方式进行选择:

方法1:这里有一个基于NumPy的方法-

In [89]: a = np.array([1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3])
    ...: b = np.array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1])
    ...: 

In [90]: idx = np.append(np.nonzero(a[1:] > a[:-1])[0], a.size-1)[:,None] - [2,1,0]

In [91]: b[idx].ravel()
Out[91]: array([5, 6, 7, 2, 3, 4, 9, 0, 1])
如果您从数据帧的列(分别命名为a和b的df)接收这些数据,作为预处理步骤,我们需要将它们提取为数组,如下所示-

a = df.a.values
b = df.b.values
请注意,这假设每组至少有三个元素。对于每组少于3个元素的情况,请阅读下一种方法

方法2:使用创建一个遮罩,用于从b中选择元素-

样本运行-

In [198]: a
Out[198]: array([1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3])

In [199]: b
Out[199]: array([5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1])

In [200]: filter_lastN(a,b,3)
Out[200]: array([5, 6, 7, 2, 3, 4, 9, 0, 1])

In [201]: filter_lastN(a,b,5)
Out[201]: array([5, 6, 7, 0, 1, 2, 3, 4, 7, 8, 9, 0, 1])
In [89]: a = np.array([1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3])
    ...: b = np.array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1])
    ...: 

In [90]: idx = np.append(np.nonzero(a[1:] > a[:-1])[0], a.size-1)[:,None] - [2,1,0]

In [91]: b[idx].ravel()
Out[91]: array([5, 6, 7, 2, 3, 4, 9, 0, 1])
a = df.a.values
b = df.b.values
from scipy.ndimage.morphology import binary_dilation as imdilate
def filter_lastN(a, b, N):
    mask = np.zeros(a.size,dtype=bool)
    mask[np.append(np.nonzero(a[1:] > a[:-1])[0],b.size-1)] = 1
    return b[imdilate(mask,np.ones(N),origin=(N-1)//2)]
In [198]: a
Out[198]: array([1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3])

In [199]: b
Out[199]: array([5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1])

In [200]: filter_lastN(a,b,3)
Out[200]: array([5, 6, 7, 2, 3, 4, 9, 0, 1])

In [201]: filter_lastN(a,b,5)
Out[201]: array([5, 6, 7, 0, 1, 2, 3, 4, 7, 8, 9, 0, 1])