2016-03-14 59 views
0

如果在該行中存在一定數量的「na」,我想要獲得該項目的名稱的第一部分(存儲在第0列中)的數組A然後將該名稱的第一部分(在' - '之前)存儲在一個集合中。在數組中有幾個出現時創建集合

如果我只查找一行'na',我的代碼就有效。但我不知道如何調整到例如> 2'na's。我試圖用.count()函數做到這一點,但後來我得到了一個錯誤信息,我不能在數組中使用它。

todelete = set(row[0].split(" - ", 1)[1] for row in A[0:] if 'na' in row) 

我的輸入A與以下示例具有相同的形式,我想將字符串'BCDE'存儲在我的集合中。

A = (['A - BCDE', '3413', '4354', '6655', '6573', '7523', 'na'], 
     ['A - CDEF', '7663', '5332', '2364', '1263', '3234', '4343'], 
     ['B - BCDE', 'na', 'na', '3443', 'na', '4153', '1223'], 
     ['B - CDEF', '3456', '8756', '3456', '2345', '3456', '1234']) 
+0

後一些輸入的例子吧。即「A」變種的各種例子。 – loutre

+0

查看如何創建[mcve] –

回答

1
假設

A所有值都是字符串:

set(row[0].split(" - ", 1)[1] for row in A[0:] 
    if len(filter(lambda item: 'na' in item, row)) > 2) 

如果需要的'na'A僅確切值:

set(row[0].split(" - ", 1)[1] for row in A[0:] 
    if len(filter(lambda item: 'na' == item, row)) > 2) 

此示例:

A = (['A - BCDE', '3413', '4354', '6655', '6573', '7523', 'na'], 
    ['A - CDEF', '7663', '5332', '2364', '1263', '3234', '4343'], 
    ['B - BCDE', 'na', 'na', '3443', 'na', '4153', '1223'], 
    ['B - CDEF', '3456', '8756', '3456', '2345', '3456', '1234']) 

將輸出設定:

{'BCDE'} 

如果行值不限於字符串,在過濾器功能的類型檢查是必需的:

set(row[0].split(" - ", 1)[1] for row in A[0:] 
    if len(filter(lambda item: isinstance(item, str) and 'na' in item, row)) > 2) 
+0

我在A字符串中設置所有值,然後您的方法完美工作,非常感謝! – Dave

1

看起來像你的問題實際上是如何計算的出現'na'在一個numpy數組中。沒有該功能,但它很容易寫一個:

def count(a, v): 
    return a[a == v].size 

則:

todelete = set(row[0].split(" - ", 1)[1] for row in A[0:] if count(row, 'na') > 2)