Frage Häufigkeitstabelle für eine einzelne Variable


Eine letzte Pandabärenfrage für den Tag: Wie erzeuge ich eine Tabelle für eine einzelne Serie?

Beispielsweise:

my_series = pandas.Series([1,2,2,3,3,3])
pandas.magical_frequency_function( my_series )

>> {
     1 : 1,
     2 : 2, 
     3 : 3
   }

Viel Googeln hat mich zu Series.describe () und Pandas.crosstabs geführt, aber keines von beiden macht das, was ich brauche: eine Variable, zählt nach Kategorien. Oh, und es wäre schön, wenn es für verschiedene Datentypen funktioniert: Strings, Ints usw.


75
2017-08-31 00:10


Ursprung


Antworten:


Könnte sein .value_counts()?

>>> import pandas
>>> my_series = pandas.Series([1,2,2,3,3,3, "fred", 1.8, 1.8])
>>> my_series
0       1
1       2
2       2
3       3
4       3
5       3
6    fred
7     1.8
8     1.8
>>> counts = my_series.value_counts()
>>> counts
3       3
2       2
1.8     2
fred    1
1       1
>>> len(counts)
5
>>> sum(counts)
9
>>> counts["fred"]
1
>>> dict(counts)
{1.8: 2, 2: 2, 3: 3, 1: 1, 'fred': 1}

125
2017-08-31 00:14



Sie können das Listenverständnis für einen Datenrahmen verwenden, um die Häufigkeiten der Spalten als solche zu zählen

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]

Nervenzusammenbruch:

my_series.select_dtypes(include=['O']) 

Wählt nur die kategorischen Daten aus

list(my_series.select_dtypes(include=['O']).columns) 

Dreht die Spalten von oben in eine Liste

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)] 

Durchläuft die obige Liste und wendet value_counts () auf jede der Spalten an


8
2018-01-28 12:28



Die Antwort von @DSM ist einfach und direkt, aber ich dachte, ich würde meine Frage zu dieser Frage hinzufügen. Wenn Sie sich den Code ansehen pandas.value_countsDu wirst sehen, dass da viel passiert.

Wenn Sie die Häufigkeit vieler Serien berechnen müssen, kann dies eine Weile dauern. Eine schnellere Implementierung wäre zu verwenden numpy.unique mit return_counts = True

Hier ist ein Beispiel:

import pandas as pd
import numpy as np

my_series = pd.Series([1,2,2,3,3,3])

print(my_series.value_counts())
3    3
2    2
1    1
dtype: int64

Beachten Sie, dass das zurückgegebene Objekt eine Pandas.Series ist

Im Vergleich, numpy.unique gibt ein Tupel mit zwei Elementen zurück, den eindeutigen Werten und den Zählwerten.

vals, counts = np.unique(my_series, return_counts=True)
print(vals, counts)
[1 2 3] [1 2 3]

Sie können diese dann zu einem Wörterbuch kombinieren:

results = dict(zip(vals, counts))
print(results)
{1: 1, 2: 2, 3: 3}

Und dann in ein pandas.Series

print(pd.Series(results))
1    1
2    2
3    3
dtype: int64

2
2017-12-13 18:45