我有一个数组,其中包含五个不同类别(A-E)中三个不同指标(X-Z)的数据。 现在我想检查数据集中的每一列是否有0。如果连续存在0,我想删除此类型的所有指标。
在我的最小例子中,它应该在Y行之一中找到零并因此删除所有Y行。
AA =(['0','A','B','C','D','E'],
['X','2','3','3','3','4'],
['Y','3','4','9','7','3'],
['Z','3','4','6','3','4'],
['X','2','3','3','3','4'],
['Y','3','4','8','7','0'],
['Z','3','4','6','3','4'],
['X','2','5','3','3','4'],
['Y','3','4','0','7','3'],
['Z','3','4','6','3','4'])
我的代码如下:
import numpy as np
sequence = 3 #number of columns per sequence X,Y,Z
AA = np.array(AA)
for i in range(1,AA.shape[0]):
for j in range(1,AA.shape[1]):
if j == 0.0:
for k in range(np.min((j-1)/sequence,1),AA.shape[0],sequence):
np.delete(AA, k, 0)
并且应该给我:
AA =(['0','A','B','C','D','E'],
['X','2','3','3','3','4'],
['Z','3','4','6','3','4'],
['X','2','3','3','3','4'],
['Z','3','4','6','3','4'],
['X','2','5','3','3','4'],
['Z','3','4','6','3','4'])
但不知何故,我的代码不会删除任何内容。所以我想我的删除功能有问题,但我无法弄清楚究竟是什么问题。
编辑: 在我的真实数据中,指标(X-Z)并不具有完全相同的名称,而是“asdf - X”或“qwer - Y - asdf”。因此,第一个' - '分隔符之后的标签部分始终是相同的。
所以我不能对它们使用set()函数,而是必须通过距检测到0的行的距离来选择要删除的行。
答案 0 :(得分:4)
我会两次通过。它更清洁,在某些情况下甚至可能更快。这是一个没有numpy的实现;随意将其转换为使用array()
。
AA =(['0','A','B','C','D','E'],
['X','2','3','3','3','4'],
['Y','3','4','9','7','3'],
['Z','3','4','6','3','4'],
['X','2','3','3','3','4'],
['Y','3','4','8','7','0'],
['Z','3','4','6','3','4'],
['X','2','5','3','3','4'],
['Y','3','4','0','7','3'],
['Z','3','4','6','3','4'])
todrop = set(row[0] for row in AA[1:] if '0' in row)
filtered = list(row for row in AA[1:] if row[0] not in todrop)
由于row[0]
不包含确切的指标标签,因此请编写一个简单的函数来提取标签并使用该标签而不是整个row[0]
。详细信息取决于您的数据实际的外观。
选项2:如果确实想要通过计算行来实现它(我不建议这样做):保存模数为3的行号,而不是行ID。它的工作量相同:
relabeled = list((n % 3, row) for n, row in enumerate(AA[1:]))
todrop = set(n for n, row in relabeled if '0' in row) # Will save {1} for Y
filtered = list(row for n, row in relabeled if n not in todrop)
答案 1 :(得分:2)
你试图在循环中删除某些东西,但它不起作用,因为它会丢失引用。
不要删除当前矩阵,而是尝试使用您想要的值构建另一个矩阵,然后将矩阵分配给刚刚创建的矩阵