2016-05-14 1 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未満の行でも発生するものを排除します。NaN。ループの使用を避ける。

まず、欠損値の制限を満たしている(とコメントで述べたデータの問題に対処するために.strip()を追加)しないdfの一部に一意の値のsetを取得:

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'} 

次に、特定あなたの制限を満たしていない値の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'} 
最後に

、常にrestriを満たしていない値を排除するために上記の間set違いを取りますction:

result = sorted(enough_non_nan - not_enough_non_nan) 

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

いいえ@スティファンそれはありません。私がここに示したテーブルは単なるサンプルであり、実際のものは1〜2個のNaN値を持つ行の数が何千もの行を持っているため、1Dリストに変換できません。私は具体的には、 'List1'の各要素で行をスキャンし、次にそれらを再インデックスする必要があります。次に新しい行のそれぞれで非NaN要素の数を確認してから、新しいリストを更新してください。 – controlfreak

+0

常に2つ以上のNaN値を持たない 'List1'の値を識別しようとしています。つまり、' .count()<= 1'の行には発生しません。 – Stefan

+0

少なくとも2つのNaN以外の値が存在する行の存在を示す "List1"の値を特定しようとしています。したがって、 'List1'の各要素 'V'に対して、 'V'を含む 'ABC'の行をチェックし、 '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

関連する問題