2016-03-11 46 views
0

我有一个数组包含五个不同类别(A-E)中三个不同指标(X-Z)的数据。 现在我想检查数据集中的每一列是否有0。如果连续有0,我想删除这种类型的所有指标。如何删除一个包含零的第n行?

在我的最小的例子中,它应该找到其中一个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的行的距离来选择要删除的行。

+1

问题是在删除功能之前。我认为j从1到AA.shape [1]从不等于0。你希望AA [i,j] 0 – Glostas

+0

@Glostas,非常感谢你的输入!尽管我对编码很陌生,但我应该注意到这一点。但即使有这种适应'如果AA [i,j] == 0.0:'我的删除功能不起作用。 – Dave

+0

我没有真正检查它。在AA中你有字符串,0.0是一个浮点数。这永远不可能是平等的。尝试如果AA [i,j]是否为'0'。作为一般的提示:使用print('输入if')或其他东西来检查代码是否进入你的if语句 – Glostas

回答

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

非常感谢,这是解决最小例子的好方法。不幸的是,我举这个例子太简单了,因为名字X,Y,Z不完全一样,但是评价者'X-asdf','X-asd','Xasdf',所以我只知道行I想要完全删除。不过,我会尝试是否可以以某种方式存储索引,然后加上多个距离,因为我在代码中使用“序列”尝试了它。 – Dave

+1

如果可以从实际标签中系统地提取名称'X','Y','Z',那么这对上述内容来说是一个很小的修改。在问题中添加一段来解释命名 - 例如,第一个字母是否足够?我知道你的标题是关于删除每一个第n行,但是我是通过问题文本进行的,因为如果两种方法都可行,它会更加健壮。 – alexis

+0

我会尝试使用标签的“可提取”部分或其他行计数。只要我成功了,我可以通过检查你的答案让你知道。 – Dave

2

您正在试图删除的东西,而通过它的循环,它不会工作,因为它会失去引用。
而不是删除当前矩阵,尝试建立另一个与您想要的值,然后将矩阵分配给您刚创建的一个