2014-09-07 5 views
20

Ich habe eine ListePython Äquivalent von R Tabelle

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

I die Frequenz jedes Element in dieser Liste zählen soll. So etwas wie

freq[[12,6]] = 40 

In R Dies kann mit der table Funktion erhalten werden. Gibt es in python3 etwas Ähnliches?

+0

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

Antwort

17

Ein Counter Objekt aus der Bibliothek collections funktioniert so.

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 

Sie das Ergebnis wie erhalten:

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

und für [(12,6)] finden Sie genaue Zahl erhalten, hier 28

mehr über pandas, die leistungsstarke Python Datenanalyse-Toolkit ist Sie können im offiziellen Dokument lesen: http://pandas.pydata.org/pandas-docs/stable/

UPDATE:

Wenn Auftrag gerade spielt keine Rolle, sortiert verwenden: ps = pandas.Series([tuple(sorted(i)) for i in x]) danach Ergebnis:

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

Gibt es einen einfachen Weg mit Pandas, um gleiche Permutation von Elementen zu betrachten? [12,0] = [0,12]? – Donbeo

+0

@Donbeo siehe Update. Sorted sollte der einfachste Weg sein, es zu tun ;-) – andi

+1

ja auch mit Set statt Sortieren funktioniert es – Donbeo

50

Pandas hat eine eingebaute Funktion value_counts() genannt.

Beispiel: Bei einer Datenrahmen eine Spalte mit Werten als 0 und 1 ist hat, und Sie möchten die Gesamt Frequenzen für jeden von ihnen zählen, dann ist diese einfach nutzen:

df.colName.value_counts() 
+6

Dies sollte wirklich die beste Antwort sein. –

+0

'value_counts' ist eine Methode der Klasse'pandas.Series', nicht' pandas.DataFrame'. Es zählt nur aus Spalten, nicht aus Datenfeldern, im Gegensatz zur R-Tabellenfunktion. – Jacquot

2

Gesetzt müssen Sie die konvertieren Daten zu einem pandas DataFrame sowieso, so dass Sie

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

dann wie in this answer vorgeschlagen, dass Sie tun können, mit groupby.size():

tab sieht wie folgt aus:

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

und kann leicht mit unstack() zu einer Tabellenform geändert werden:

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 und convert to int in Ihrer Freizeit!

+0

Dies entspricht funktionell der Funktion R 'table'. – Jacquot

0

IMHO, Pandas bietet eine bessere Lösung für dieses "Tabellierung" Problem:

Eine Dimension:

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

Anteil zählen:

my_tab/my_tab.sum() 

Zwei-Dimensionen (mit Summen):

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

cross 

Ich bin sehr dankbar für diesen Blog:

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