Python 获取数据帧行,其中每T列序列有1n次

Python 获取数据帧行,其中每T列序列有1n次,python,pandas,numpy,dataframe,matrix,Python,Pandas,Numpy,Dataframe,Matrix,如何获得一个数据帧的行,该数据帧在5列的每个序列中至少是数字1的3倍? 填充了1和0的数据帧不缺少值 例如: 此外,由于我需要检查数以百万计的线路和数十列COL,快速方法将非常有用 将底层数组数据重塑为3D,以便最后一个轴有5个元素,每个元素代表5个块,然后沿该轴求和,为每个块求和,最后沿第二个轴使用表示原始数据帧中每行的任何缩减- df['result'] = (df.values.reshape(-1,df.shape[1]//5,5).sum(2)>=3).any(1) 为了提高

如何获得一个数据帧的行,该数据帧在5列的每个序列中至少是数字1的3倍? 填充了1和0的数据帧不缺少值

例如:


此外,由于我需要检查数以百万计的线路和数十列COL,快速方法将非常有用

将底层数组数据重塑为3D,以便最后一个轴有5个元素,每个元素代表5个块,然后沿该轴求和,为每个块求和,最后沿第二个轴使用表示原始数据帧中每行的任何缩减-

df['result'] = (df.values.reshape(-1,df.shape[1]//5,5).sum(2)>=3).any(1)
为了提高性能,您可能需要使用布尔数组:df.values==1,而不是df.values

样本运行-

In [41]: df
Out[41]: 
   0  1  2  3  4  5  6  7  8  9
0  0  1  1  0  0  1  0  0  0  1
1  0  0  0  0  0  0  1  0  1  1
2  0  1  1  0  0  1  1  0  0  1
3  1  1  1  1  0  0  0  1  0  1
4  0  1  1  1  0  1  1  1  1  0
5  0  0  0  0  1  0  0  1  1  1
6  0  0  1  0  1  1  0  0  0  1

In [42]: df['result'] = (df.values.reshape(-1,df.shape[1]//5,5).sum(2)>=3).any(1)

In [43]: df
Out[43]: 
   0  1  2  3  4  5  6  7  8  9  result
0  0  1  1  0  0  1  0  0  0  1   False
1  0  0  0  0  0  0  1  0  1  1    True
2  0  1  1  0  0  1  1  0  0  1    True
3  1  1  1  1  0  0  0  1  0  1    True
4  0  1  1  1  0  1  1  1  1  0    True
5  0  0  0  0  1  0  0  1  1  1    True
6  0  0  1  0  1  1  0  0  0  1   False
如果列的数量不是5的倍数,我们可以使用np.add.reduceat-

数百万行和几十列的计时-


将底层数组数据重塑为3D,使最后一个轴上有5个元素,每个元素代表5个块,然后沿该轴求和,为每个块求和,最后沿第二个轴使用任何缩减,该轴代表原始数据帧中的每一行-

df['result'] = (df.values.reshape(-1,df.shape[1]//5,5).sum(2)>=3).any(1)
为了提高性能,您可能需要使用布尔数组:df.values==1,而不是df.values

样本运行-

In [41]: df
Out[41]: 
   0  1  2  3  4  5  6  7  8  9
0  0  1  1  0  0  1  0  0  0  1
1  0  0  0  0  0  0  1  0  1  1
2  0  1  1  0  0  1  1  0  0  1
3  1  1  1  1  0  0  0  1  0  1
4  0  1  1  1  0  1  1  1  1  0
5  0  0  0  0  1  0  0  1  1  1
6  0  0  1  0  1  1  0  0  0  1

In [42]: df['result'] = (df.values.reshape(-1,df.shape[1]//5,5).sum(2)>=3).any(1)

In [43]: df
Out[43]: 
   0  1  2  3  4  5  6  7  8  9  result
0  0  1  1  0  0  1  0  0  0  1   False
1  0  0  0  0  0  0  1  0  1  1    True
2  0  1  1  0  0  1  1  0  0  1    True
3  1  1  1  1  0  0  0  1  0  1    True
4  0  1  1  1  0  1  1  1  1  0    True
5  0  0  0  0  1  0  0  1  1  1    True
6  0  0  1  0  1  1  0  0  0  1   False
如果列的数量不是5的倍数,我们可以使用np.add.reduceat-

数百万行和几十列的计时-


创建宽度为5的滚动总和,查看从第5列到最后的所有列,如果值始终为3或以上,则选择它们:

rolling_sum = df.rolling(5, min_periods=1, axis=1).sum()
select = (rolling_sum.iloc[:, 4:] >= 3).all(axis=1)

In [92]: df
Out[92]: 
   0  1  2  3  4  5  6  7  8  9
0  0  0  0  0  0  0  0  0  0  0
1  0  1  0  0  1  0  1  1  0  0
2  0  1  0  1  1  0  0  1  0  0
3  0  1  1  1  0  1  1  1  1  1
4  0  1  0  1  1  1  0  0  1  1
5  0  0  1  1  1  0  1  1  1  0

In [94]: (df.rolling(5, min_periods=1, axis=1).sum().iloc[:, 4:] >= 3).all(axis=1)
Out[94]: 
0    False
1    False
2    False
3     True
4     True
5     True
dtype: bool

创建宽度为5的滚动总和,查看从第5列到最后的所有列,如果值始终为3或以上,则选择它们:

rolling_sum = df.rolling(5, min_periods=1, axis=1).sum()
select = (rolling_sum.iloc[:, 4:] >= 3).all(axis=1)

In [92]: df
Out[92]: 
   0  1  2  3  4  5  6  7  8  9
0  0  0  0  0  0  0  0  0  0  0
1  0  1  0  0  1  0  1  1  0  0
2  0  1  0  1  1  0  0  1  0  0
3  0  1  1  1  0  1  1  1  1  1
4  0  1  0  1  1  1  0  0  1  1
5  0  0  1  1  1  0  1  1  1  0

In [94]: (df.rolling(5, min_periods=1, axis=1).sum().iloc[:, 4:] >= 3).all(axis=1)
Out[94]: 
0    False
1    False
2    False
3     True
4     True
5     True
dtype: bool

一种简单的方法是将所有不同于1到0的值设置为df[df!=1]=0,然后运行相同的算法。也许在df的副本上执行此操作以保留原始值。一种简单的方法是将所有值设置为1到0 df[df!=1]=0,然后运行相同的算法。也许在df的副本上执行此操作以保持原始值。