2014-09-07 14 views
20

Ho una listapitone equivalente di tabella R

[[12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [6, 0], [12, 6], [0, 6], [12, 0], [0, 6], [0, 6], [12, 0], [0, 6], [6, 0], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [0, 6], [0, 6], [12, 6], [6, 0], [6, 0], [12, 6], [12, 0], [12, 0], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 0], [12, 0], [12, 0], [12, 0], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [12, 6], [12, 0], [0, 6], [6, 0], [12, 0], [0, 6], [12, 6], [12, 6], [0, 6], [12, 0], [6, 0], [6, 0], [12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [12, 0], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [0, 6], [12, 0], [12, 6], [0, 6], [0, 6], [12, 0], [0, 6], [12, 6], [6, 0], [12, 6], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [12, 6], [12, 0], [6, 0], [12, 6], [6, 0], [12, 0], [6, 0], [12, 0], [6, 0], [6, 0]] 

Voglio contare la frequenza di ogni elemento in questo elenco. Qualcosa come

freq[[12,6]] = 40 

In R questo può essere ottenuto con la funzione table. C'è qualcosa di simile in python3?

+0

[ 'collections.Counter'] (https://docs.python.org/2/library/collections.html#collections.Counter)? – jonrsharpe

risposta

17

Un oggetto Counter dalla libreria collections funzionerà in questo modo.

from collections import Counter 

x = [[12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [6, 0], [12, 6], [0, 6], [12, 0], [0, 6], [0, 6], [12, 0], [0, 6], [6, 0], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [0, 6], [0, 6], [12, 6], [6, 0], [6, 0], [12, 6], [12, 0], [12, 0], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 0], [12, 0], [12, 0], [12, 0], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [12, 6], [12, 0], [0, 6], [6, 0], [12, 0], [0, 6], [12, 6], [12, 6], [0, 6], [12, 0], [6, 0], [6, 0], [12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [12, 0], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [0, 6], [12, 0], [12, 6], [0, 6], [0, 6], [12, 0], [0, 6], [12, 6], [6, 0], [12, 6], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [12, 6], [12, 0], [6, 0], [12, 6], [6, 0], [12, 0], [6, 0], [12, 0], [6, 0], [6, 0]] 

# Since the elements passed to a `Counter` must be hashable, we have to change the lists to tuples. 
x = [tuple(element) for element in x] 

freq = Counter(x) 

print freq[(12,6)] 

# Result: 28 
19
import pandas 
x = [[12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [6, 0], [12, 6], [0, 6], [12, 0], [0, 6], [0, 6], [12, 0], [0, 6], [6, 0], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [0, 6], [0, 6], [12, 6], [6, 0], [6, 0], [12, 6], [12, 0], [12, 0], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 0], [12, 0], [12, 0], [12, 0], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [12, 6], [12, 0], [0, 6], [6, 0], [12, 0], [0, 6], [12, 6], [12, 6], [0, 6], [12, 0], [6, 0], [6, 0], [12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [12, 0], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [0, 6], [12, 0], [12, 6], [0, 6], [0, 6], [12, 0], [0, 6], [12, 6], [6, 0], [12, 6], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [12, 6], [12, 0], [6, 0], [12, 6], [6, 0], [12, 0], [6, 0], [12, 0], [6, 0], [6, 0]] 
ps = pandas.Series([tuple(i) for i in x]) 
counts = ps.value_counts() 
print counts 

si otterrà il risultato come:

(12, 0) 33 
(12, 6) 28 
(6, 0)  20 
(0, 6)  19 

e per [(12,6)] otterrete il numero esatto, qui più 28

su pandas, che è potente dati Python analisi toolkit , puoi leggere nel documento ufficiale: http://pandas.pydata.org/pandas-docs/stable/

UPDATE:

Se l'ordine non importa basta usare allineati: ps = pandas.Series([tuple(sorted(i)) for i in x]) dopo che risultato è:

(0, 6)  39 
(0, 12) 33 
(6, 12) 28 
+0

esiste un modo semplice con i panda per considerare la permutazione uguale degli elementi? [12,0] = [0,12]? – Donbeo

+0

@Donbeo vedi aggiornamento. Ordinato dovrebbe essere il modo più semplice per farlo ;-) – andi

+1

sì, anche usando set invece di ordinarlo funziona – Donbeo

50

Panda ha una funzione built-in chiamato value_counts().

Esempio: se la dataframe ha una colonna con i valori di 0 e di 1, e si desidera contare le frequenze totali per ciascuno di essi, quindi è sufficiente utilizzare questo:

df.colName.value_counts() 
+6

Questa dovrebbe essere la risposta migliore. –

+0

'value_counts' è un metodo della classe'pandas.Series', non' pandas.DataFrame'. Conta solo da colonne, non da dataframes, a differenza della funzione di tabella R. – Jacquot

2

Supponendo è necessario convertire il dati a un pandas DataFrame in ogni caso, in modo da avere

L = [[12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [6, 0], [12, 6], [0, 6], [12, 0], [0, 6], [0, 6], [12, 0], [0, 6], [6, 0], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [0, 6], [0, 6], [12, 6], [6, 0], [6, 0], [12, 6], [12, 0], [12, 0], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 0], [12, 0], [12, 0], [12, 0], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [0, 6], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [12, 6], [12, 0], [0, 6], [6, 0], [12, 0], [0, 6], [12, 6], [12, 6], [0, 6], [12, 0], [6, 0], [6, 0], [12, 6], [12, 0], [0, 6], [12, 0], [12, 0], [12, 0], [6, 0], [12, 6], [12, 6], [12, 6], [12, 6], [0, 6], [12, 0], [12, 6], [0, 6], [0, 6], [12, 0], [0, 6], [12, 6], [6, 0], [12, 6], [12, 6], [12, 0], [12, 0], [12, 6], [0, 6], [6, 0], [12, 0], [6, 0], [12, 0], [12, 0], [12, 6], [12, 0], [6, 0], [12, 6], [6, 0], [12, 0], [6, 0], [12, 0], [6, 0], [6, 0]] 
df = pd.DataFrame(L, columns=('a', 'b')) 

allora si può fare come suggerito in this answer, utilizzando groupby.size():

tab = df.groupby(['a', 'b']).size() 

tab appare come segue:

In [5]: tab 
Out[5]: 
a b 
0 6 19 
6 0 20 
12 0 33 
    6 28 
dtype: int64 

e può essere facilmente modificato per una forma tabella con unstack():

In [6]: tab.unstack() 
Out[6]: 
b  0  6 
a 
0 NaN 19.0 
6 20.0 NaN 
12 33.0 28.0 

Fill NaNs e convert to int a vostro piacimento!

+0

QUESTO è funzionalmente equivalente alla funzione R 'table'. – Jacquot

0

IMHO, panda offre una soluzione migliore per questo "tabulazione" problema:

Una dimensione: contano

my_tab = pd.crosstab(index = df["feature_you_r_interested_in"], 
           columns="count") 

Proporzione:

my_tab/my_tab.sum() 

Due dimensioni (con totali):

cross = pd.crosstab(index=df["feat1"], 
          columns=df["feat2"], 
          margins=True) 

cross 

Sono molto grato per questo blog:

http://hamelg.blogspot.com.br/2015/11/python-for-data-analysis-part-19_17.html