2016-05-14 83 views
3

我有一個很大的DataFrame與許多重複值。唯一值存儲在List1中。我想執行以下操作:如何計算根據條件選擇的一組行中元素的數量?

  1. 選擇幾行包含列表中的每個值。
  2. 迭代選定的行並計算非NaN元素的數量
  3. 如果計數值大於或等於2,則將其存儲在新列表中。 List1中的每個組件只能在全部爲的情況下添加到eq_list'eq'的計數值> = 2。

一個簡化的樣品輸入:

List1 = ['A','B','C','D','E','F','G','H','X','Y','Z'] 

Sample DF 'ABC': 

     EQ1 EQ2 EQ3 
0  A NaN NaN 
1  X Y  NaN 
2  A X  C 
3  D E  F 
4  G H  B 

所需的輸出:

eq_list = ['B','C','D','E','F','G','H','X','Y'] 

小碼我想:

for eq in List1: 
    MCS=ABC.loc[MCS_old[:] ==eq] 
    MCS = MCS.reset_index(drop=True) 
    for index_new in range(0,len(MCS)-1): 
     if int(MCS.iloc[[index_new]].count(axis=1))>2: 
      eq_list.append(raw_input(eq)) 
      print(eq_list) 

我希望我所做的問題明確。

+0

我是正確的假設,'eq_list'是一套獨特的信嗎? –

+0

'eq_list'是最終的輸出並且是'List1'的子集,它沒有重複。所以,是的。我想我在回答線程 – controlfreak

+0

PLs的最後一條評論中解釋得更好 –

回答

1

下面標識了在具有多於2個非NaN值的行中出現的(唯一)值的set,消除了那些也出現在行數小於2的行中且值不低於2的行。避免使用循環。

na_threshold = 1 
not_enough_non_nan = df[df.count(axis=1) <= 1].values.flatten().astype(str) 
not_enough_non_nan = set([str(l).strip() for l in not_enough_non_nan if not l == 'nan']) 

{'A'} 

其次,確定了:

首先,拿在df部分獨特的價值觀不符合的缺失值限制(和添加.strip(),以解決在評論中提到一個數據問題)的set那些滿足限制值的set

enough_non_nan = df[df.count(axis=1) > 1].values.flatten().astype(str) 
enough_non_nan = set([str(l).strip() for l in enough_non_nan if not l == 'nan']) 

{'H', 'C', 'E', 'B', 'D', 'X', 'F', 'A', 'Y', 'G'} 

最後,走在上面的set差消除值並不總是符合restri ction:

result = sorted(enough_non_nan - not_enough_non_nan) 

['B', 'C', 'D', 'E', 'F', 'G', 'H', 'X', 'Y'] 
+0

請參見我的回答否@Stefan它不會。我不能將它轉換爲一維列表,因爲我在這裏展示的表只是一個示例,而真正的表具有成千上萬行具有一個或兩個NaN值的行。我特別需要掃描「List1」中每個元素的行,然後重新索引它們,然後檢查每個新行中的非NaN元素的數量,然後更新新列表 – controlfreak

+0

但是,您是試圖在'List1'中標識總是有2個以上非'NaN'值的值,即它們不會在具有'.count()<= 1'的行中出現,而它們在其他地方確實存在? – Stefan

+0

我試圖確定「List1」中的值是否在行中存在至少2個非NaN值。因此,對於'List1'中的每個元素'V',都必須檢查'ABC'中包含'V'的行,然後確保其中每個'V'行至少有2個非NaN值。如果是,請將「V」添加到eq_list – controlfreak

1

假設您有:

df 
    EQ1 EQ2 EQ3 
0 A NaN NaN 
1 X Y NaN 
2 A X C 
3 D E F 
4 G H B 

然後,您可以進行如下操作:

dft = df.T 
output_set = set() 
prune_set = set() 
for column in dft: 
    arr = dft[column].dropna().values 
    if len(arr) >=2: 
     output_set |= set(arr) 
    else: 
     prune_set |= set(arr) 
sorted(output_set - prune_set) 
['B', 'C', 'D', 'E', 'F', 'G', 'H', 'X', 'Y'] 
+0

它不起作用@sergey。我試過 – controlfreak

+0

它在你提供的例子上工作併產生所需的輸出。你的意思是它在另一個df上「不起作用」? –

+0

是的,它不適用於我正在使用的真正df,它與我提供的示例具有相似的結構,但大小差別很大。它創建具有相同值的新列表元素,然後添加一個額外的空間並顯示哪個是錯誤 – controlfreak

相關問題