Python 如果一行包含零,如何删除该行的每N行?

Python 如果一行包含零,如何删除该行的每N行?,python,arrays,numpy,Python,Arrays,Numpy,我有一个数组,其中包含五个不同类别(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'], [

我有一个数组,其中包含五个不同类别(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']) 
但不知何故,我的代码并没有删除任何内容。所以我想我的delete函数有问题,但我不知道到底是什么问题

编辑: 在我的真实数据中,指标(X-Z)的名称并不完全相同,而是“asdf-X”或“qwer-Y-asdf”。因此,第一个“-”分隔符后面的标签部分始终相同


因此,我不能对它们使用set()函数,而是必须根据与检测到0的行的距离来选择要删除的行。

我将在两次过程中完成此操作。它更干净,在某些情况下甚至可能更快。这是一个没有numpy的实现;请随意将其转换为使用
array()

由于
行[0]
不包含确切的指示符标签,请编写一个简单的函数来提取标签并使用它,而不是整个
行[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)

我会用两次传球。它更干净,在某些情况下甚至可能更快。这是一个没有numpy的实现;请随意将其转换为使用
array()

由于
行[0]
不包含确切的指示符标签,请编写一个简单的函数来提取标签并使用它,而不是整个
行[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)

您试图在循环过程中删除某些内容,但该操作无效,因为它将丢失引用。

与其删除当前矩阵,不如尝试使用您想要的值构建另一个矩阵,然后将该矩阵分配给您刚刚创建的矩阵

您尝试在循环过程中删除某个矩阵,但该矩阵将不起作用,因为它将丢失引用。

不要删除当前矩阵,而是尝试使用您想要的值构建另一个矩阵,然后将该矩阵分配给您刚刚创建的矩阵

问题出现在删除函数之前。我认为j永远不等于0,因为它从1到AA。你想让AA[i,j]成为0@Glostas,非常感谢您的投入!尽管我对编码非常陌生,但我应该注意到这一点。但是即使使用这种自适应
如果AA[i,j]==0.0:
我的删除功能也不起作用。我没有真正检查它。在AA中,您有字符串,0.0是浮点。这永远不可能是平等的。如果AA[i,j]为“0”,请尝试。作为一般提示:使用print('enter if')或其他方法检查代码是否进入if语句谢谢,我一定会在下一个问题中尝试使用'enter if'技巧!你没有回答我关于标签的问题。它们有多“不完全相同”呢?问题是在删除函数之前。我认为j永远不等于0,因为它从1到AA。你想让AA[i,j]成为0@Glostas,非常感谢您的投入!尽管我对编码非常陌生,但我应该注意到这一点。但是即使使用这种自适应
如果AA[i,j]==0.0:
我的删除功能也不起作用。我没有真正检查它。在AA中,您有字符串,0.0是浮点。这永远不可能是平等的。如果AA[i,j]为“0”,请尝试。作为一般提示:使用print('enter if')或其他方法检查代码是否进入if语句谢谢,我一定会在下一个问题中尝试使用'enter if'技巧!你没有回答我关于标签的问题。它们有多“不完全相同”呢?非常感谢,这是一个很好的解决方法,只需一个简单的例子。不幸的是,我把这个例子说得有点过于简单,因为名称X,Y,Z不完全相同,但是评级器'X-asdf','X-asd','Xasdf',所以我只知道我要精确删除的行之间的距离。尽管如此,我还是会尝试是否能够以某种方式存储索引,然后像我在代码中使用“序列”时那样将距离的倍数相加。如果可以从实际标签中系统地提取名称
X
Y
Z
,那么这是对上述内容的一个非常小的修改。在问题中添加一段来解释命名——例如,第一个字母就足够了吗?我知道你的标题是关于删除每第n行,但我选择了问题文本,因为如果两种方法都可行,它会更健壮。我将尝试使用标签的“可提取”部分或行计数。一旦我成功了,我可以通过检查你的答案让你知道。非常感谢,这是一个很好的解决方法,只需一个简单的例子。不幸的是,我把这个例子说得有点过于简单,因为名称X,Y,Z不完全相同,但是评级器'X-asdf','X-asd','Xasdf',所以我只知道我要精确删除的行之间的距离。尽管如此,我还是会尝试是否能够以某种方式存储索引,然后像我在代码中使用“序列”时那样将距离的倍数相加。如果可以从实际标签中系统地提取名称
X
Y
Z
,那么这是对上述内容的一个非常小的修改。在问题中添加一段来解释命名——例如,第一个字母就足够了吗?我知道你的头衔是关于德勒的