2014-04-21 12 views
9

Ich habe eine dataframe mit zahlreichen Spalten (≈30) von einer externen Quelle (CSV-Datei), aber mehrere von ihnen haben keinen Wert oder immer gleich. Also würde ich schnell die value_counts für jede Spalte sehen, wie kann ich das tun?pandas value_counts auf jede Spalte angewendet

Zum Beispiel

Id, temp, name 
1 34, null, mark 
2 22, null, mark 
3 34, null, mark 

Zurückkehren würde mir ein Objekt besagt, dass

  • Id: 34 -> 2, 22 -> 1
  • Temp: null -> 3
  • Namen : mark -> 3

So würde ich wissen, dass Temp ist irrelevant und der Name ist nicht interessant (immer gleich)

+0

Schleife über die Spalten und drucken Sie eine 'value_counts' für jede ? – joris

+0

Was @joris gesagt hat. Es gibt ein [Problem] (https://github.com/pydata/pandas/pull/5381) Hinzufügen einer 'value_counts'-Methode zu DataFrame, aber es gibt ein paar Probleme mit der Indexausrichtung. – TomAugspurger

Antwort

9

Für die Datenrahmen,

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

der folgende Code

for c in df.columns: 
    print "---- %s ---" % c 
    print df[c].value_counts() 

folgendes Ergebnis produzieren wird:

---- id --- 
34 2 
22 1 
dtype: int64 
---- temp --- 
null 3 
dtype: int64 
---- name --- 
mark 3 
dtype: int64 
+0

Danke für Ihre Kommentare und Antworten. Ich dachte, es wäre möglich, ohne eine Schleife zu machen, aber es scheint, dass es nicht ist. (Und yep ich habe das Problem erwähnt, hoffe, es wird bald möglich sein :)). – Edouard

+0

Eigentlich, warum nicht mit einer Karte wie: Karte (Lambda x: x.value_counts(), mdf.columns) – Edouard

3

Sie kann df.apply verwenden, die jede Spalte mit der bereitgestellten Funktion anwenden wird, in diesem Fall das Zählen fehlender Wert. Dies ist, wie es aussieht,

df.apply(lambda x: x.isnull().value_counts())

1

Eine nette Weise, eine schön Formatierer Serie in diese und zurück zu tun, ist die Kombination von pandas.Series.value_counts und pandas.DataFrame.stack.

Für den Datenrahmen

df = pandas.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

Sie können etwas tun, wie

df.apply(lambda x: x.value_counts()).T.stack() 

In diesem Code df.apply(lambda x: x.value_counts()) gelten value_counts zu jeder Spalte und fügt es zu den resultierenden DataFrame, so dass Sie mit einem Ende DataFrame mit den gleichen Spalten und einer Zeile für jeden unterschiedlichen Wert in jeder Spalte (und viele null für jeden Wert, der nicht in jeder Spalte erscheint).

Danach transponiert T die DataFrame (so dass Sie am Ende mit einem DataFrame mit einem Index gleich den Spalten und den Spalten gleich den möglichen Werten) und stack verwandelt sich die Spalten der DataFrame in eine neue Ebene der MultiIndex und "löscht" alle Null Werte, was das Ganze zu einem Series macht.

Das Ergebnis hiervon ist

id 22  1 
     34  2 
temp null 3 
name mark 3 
dtype: float64 
0

-Code wie folgt

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=["id", 'temp', 'name'], index=[1, 2, 3]) 
result2 = df.apply(pd.value_counts) 
result2 

produzieren:

enter image description here

Verwandte Themen