2016-12-24 5 views
2

Ich habe Pandas Datenrahmen wie folgt:Wie automatisieren Reihen Filtern von Spalten

df = 

COL_1 COL_2 VAL_1 
ABC  AAA  ABC 
CDE  CDE  RTY 
ABC  ABC  RTY 
ABC  RTY  DEF 

ich mit COL beginnen die Anzahl der Zeilen enthält einen eindeutigen Wert von Spalten caculate wollen: COL_1 und COL_2 (VAL_1 sollte nicht benutzt).

Das erwartete Ergebnis ist:

GROUP COUNT 
ABC  3 
CDE  2 
RTY  1 
AAA  1 

Eine Möglichkeit ist es, manuell Spaltennamen angeben, und die Anzahl der Zeilen berechnen auch manuell alle möglichen Werte für GROUP angeben. Aber offensichtlich ist diese Lösung nicht gut, wenn die Anzahl der Spalten und Werte in GROUP groß ist.

Wie wird es automatisch gemacht? Ich denke, dass der Ansatz sein sollte, alle Zeilen zu filtern, die Tunique-Werte für Spalten haben, die mit COL beginnen?

Ich habe dies versucht, aber es dauert eine lange Zeit auf einem Datensatz von 1 GB und es gibt einige falsche Ergebnisse. Ich weiß auch nicht, wie man die Werte von GROUP: str.contains('ABC') vermeidet.

t_cols = [c for c in df.columns.values if not c.startswith('COL')] 
aa = df.drop(t_cols,axis=1) 
aa.apply(lambda row: row.astype(str).str.contains('ABC').any(), axis=1).shape 

Antwort

5

Oder Sie value_counts() verwenden können:

df.filter(regex = "^COL").stack().value_counts() 

#ABC 4 
#CDE 2 
#AAA 1 
#RTY 1 
#dtype: int64 
+1

ja, diese Lösung ist besser! :) – MaxU

+0

Das ist eine nette Lösung. Übrigens wissen Sie, wie Sie diesem Code Bedingungen hinzufügen? Ich meine, was ist, wenn ich Zeilen zählen muss, auch wenn man bedenkt, dass der Wert der Spalte "VAL_1" gleich "ABC" ist? – Dinosaurius

+0

Wenn Sie die Anzahl der Zeilen, die Sie haben, zählen, können Sie 'shape [0]' verwenden und auch den logischen Index verwenden, um Zeilen mit Bedingungen auszuwählen. Die Syntax wäre etwas wie 'df [df.VAL_1 == "ABC"]. Filter (regex = "^ COL"). Shape [0] 'je nachdem, was Sie brauchen. – Psidom

2

Ist das was du willst?

In [12]: df.filter(like='COL_').stack().to_frame('COL').groupby('COL').size() 
Out[12]: 
COL 
AAA 1 
ABC 4 
CDE 2 
RTY 1 
dtype: int64 
Verwandte Themen