2014-04-21 17 views
9

Ho un dataframe con numerose colonne (≈30) da un'origine esterna (file csv) ma molte di esse non hanno alcun valore o sempre lo stesso. Quindi, vorrei vedere rapidamente lo value_counts per ogni colonna, come posso farlo?pandas value_counts applicati a ciascuna colonna

Per esempio

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

mi avrebbe restituire un oggetto che indica che

  • Id: 34 -> 2, 22 -> 1
  • temp: null -> 3
  • nome : mark -> 3

Quindi vorrei sapere che temp è Nome irrilevante e non è interessante (sempre lo stesso)

+0

Loop sopra le colonne e stampare un 'value_counts' per ogni ? – joris

+0

Cosa ha detto @joris. C'è un [problema] (https://github.com/pydata/pandas/pull/5381) per aggiungere un metodo 'value_counts' a DataFrame, ma ci sono alcuni problemi con l'allineamento dell'indice. – TomAugspurger

risposta

9

Per la dataframe,

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

il seguente codice

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

produrrà il seguente risultato:

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

Grazie per i vostri commenti e risposte. Ho pensato che fosse possibile farlo senza un loop ma sembra che non lo sia. (e sì, ho visto il problema menzionato, spero che sarà presto possibile :)). – Edouard

+0

In realtà, perché non farlo con una mappa come: map (lambda x: x.value_counts(), mdf.columns) – Edouard

3

voi può usare df.apply che applicherà ogni colonna con la funzione fornita, in questo caso contando valore mancante. Questo è ciò che sembra,

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

1

Un bel modo per fare questo e restituire una serie ben formattatore fa dell'incontro fra pandas.Series.value_counts e pandas.DataFrame.stack.

Per la dataframe

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

Si può fare qualcosa di simile

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

In questo codice, df.apply(lambda x: x.value_counts()) vale value_counts ad ogni colonna e lo aggiunge alla conseguente DataFrame, così si finisce con un DataFrame con le stesse colonne e una riga per ogni valore diverso in ogni colonna (e molto null per ogni valore che non appare in ogni colonna).

Dopo di che, T traspone il DataFrame (così si finisce con un DataFrame con un indice pari alle colonne e le colonne pari ai valori possibili), e stack trasforma le colonne della DataFrame in un nuovo livello di MultiIndex e "elimina" tutti i valori Null, rendendo il tutto un Series.

Il risultato di questo è

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

codice come il seguente

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 

produrrà:

enter image description here

Problemi correlati