Wie zählt man die Anzahl der Elemente in einem Satz von Zeilen, die auf einer Bedingung ausgewählt werden?

Ich habe eine große DataFrame mit vielen doppelten Werten. Die eindeutigen Werte werden in List1 gespeichert. Ich möchte folgendes machen:

  1. Wählen Sie ein paar Zeilen aus, die jeden der in der Liste vorhandenen Werte enthalten.
  2. Iterate über die ausgewählten Zeilen und zähle die Anzahl der Nicht-NaN-Elemente
  3. Wenn der Zählwert größer oder gleich 2 ist, speichern Sie ihn in einer neuen Liste. Jede Komponente in eq_list nur dann bei eq_list hinzugefügt werden, wenn alle Zählwerte für die 'eq'> = 2 sind.

Ein vereinfachter Stichprobeneingang:

 List1 = ['A','B','C','D','E','F','G','H','X','Y','Z'] Sample DF 'ABC': EQ1 EQ2 EQ3 0 A NaN NaN 1 XY NaN 2 AXC 3 DEF 4 GHB 

GEWÜNSCHTES AUSGANG:

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

Das Codelet habe ich versucht:

 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) 

Ich hoffe, dass ich das Problem klar gemacht habe.

2 Solutions collect form web for “Wie zählt man die Anzahl der Elemente in einem Satz von Zeilen, die auf einer Bedingung ausgewählt werden?”

Angenommen, Sie haben:

 df EQ1 EQ2 EQ3 0 A NaN NaN 1 XY NaN 2 AXC 3 DEF 4 GHB 

Dann können Sie wie folgt vorgehen:

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

Im Folgenden wird der set von (eindeutigen) Werten identifiziert, die in Zeilen mit mehr als 2 Nicht- NaN Werten auftreten, eliminiert diejenigen, die auch in Zeilen mit weniger als 2 Nicht- NaN Werten auftreten. Vermeidung von Loops.

Zuerst erhalten Sie einen set von eindeutigen Werten in dem Teil von df , der nicht die fehlenden Werte Einschränkung (und Hinzufügen von .strip() , um eine Datenausgabe, die in den Kommentaren erwähnt wird)

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

Als nächstes identifizieren Sie die set der Werte, die Ihre Einschränkung erfüllen:

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

Schließlich nehmen Sie den set Unterschied zwischen den oben genannten, um Werte zu beseitigen nicht immer die Einschränkung:

 result = sorted(enough_non_nan - not_enough_non_nan) ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'X', 'Y'] 
  • Python3 typeError: 'function' Objekt ist nicht iterable
  • Wie bekommt man veränderbare String?
  • Aufräumen von Excel-Daten mit Python mit Pandas-Paket
  • Erstellen eines Assistenten in Tkinter
  • Python, Ctypes, mehrdimensionales Array
  • Visual Studio - NameError: name 'Tk' ist nicht definiert
  • Wie lasse und präsentiere ich rohe Binärdaten in Python?
  • Wie benutzt man concurrent.futures mit Timeouts?
  • Cython für eine Django App: würde es funktionieren?
  • EOFError: EOF beim Lesen einer Zeile
  • Relative Importe in Python 3
  • Python ist die beste Programmiersprache der Welt.