Python 获取数据帧行,其中每T列序列有1n次
如何获得一个数据帧的行,该数据帧在5列的每个序列中至少是数字1的3倍? 填充了1和0的数据帧不缺少值 例如: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) 为了提高
此外,由于我需要检查数以百万计的线路和数十列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的副本上执行此操作以保持原始值。