Bei Verwendung von "df [" category "]. Value_counts ()" heißt es, es sei ein int? aber es gibt den Spaltennamen als Index zurück? Ist es ein Datenrahmenobjekt oder kombiniert es irgendwie eine Reihe (die Anzahl) und die ursprünglichen eindeutigen Spaltenwerte?
Yoshiserry
@yoshiserry es ist eine Pandas-Serie zu tun type(df['category'].value_counts())und es wird so sagen
EdChum
Ich habe es getan, und das hat mich überrascht, aber es macht Sinn, je mehr ich darüber nachdenke. Danach zählt der Wert für einige Spalten. Es gibt Zeilen, die ich ausschließen möchte. Ich weiß, wie man Spalten entfernt, aber wie schließe ich Zeilen aus?
Yoshiserry
Antworten:
414
Verwenden Sie groupbyund count:
In[37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()Out[37]:
a
a
a 2
b 3
s 2[3 rows x 1 columns]
Auch value_counts()wie @DSM kommentiert hat, gibt es hier viele Möglichkeiten, eine Katze zu häuten
In[38]:
df['a'].value_counts()Out[38]:
b 3
a 2
s 2
dtype: int64
Wenn Sie dem ursprünglichen Datenrahmen wieder Frequenz hinzufügen möchten, verwenden Sie Folgendes transform, um einen ausgerichteten Index zurückzugeben:
In[41]:
df['freq']= df.groupby('a')['a'].transform('count')
df
Out[41]:
a freq
0 a 21 b 32 s 23 s 24 b 35 a 26 b 3[7 rows x 2 columns]
@yoshiserry Nein, Sie sehen, dass eine Reihe erstellt wird, die mit dem ursprünglichen Datenrahmen übereinstimmt, im Gegensatz zu den anderen Methoden, bei denen die eindeutigen Werte und ihre Häufigkeit angezeigt werden, wenn Sie dem Datenrahmen, für den Sie die Transformation verwenden können, nur die Häufigkeit hinzufügen möchten Dies. Es ist nur eine andere Technik. Sie stellen fest, dass der Datenrahmen nach dem Zurückweisen nicht reduziert wurde und keine Werte fehlen. Ich denke auch, dass Dataframes immer einen Index haben. Ich glaube nicht, dass Sie ihn loswerden, nur zurücksetzen, einen neuen zuweisen oder eine Spalte als Index verwenden können
EdChum
4
In Ihrem ersten Codebeispiel wird df wie erwartet zugewiesen, aber diese Zeile: df.groupby ('a'). Count () gibt einen leeren Datenrahmen zurück. Ist es möglich, dass diese Antwort mit Pandas 0.18.1 nicht mehr aktuell ist? Es ist auch etwas verwirrend, dass Ihr Spaltenname 'a' mit dem Wert übereinstimmt, den Sie nach 'a' suchen. Ich würde es selbst bearbeiten, aber da der Code für mich nicht funktioniert, kann ich mir meiner Änderungen nicht sicher sein.
Alex
1
@Alex Sie haben Recht, es sieht so aus, als ob dies in den neuesten Versionen nicht mehr funktioniert. Es scheint mir ein Fehler zu sein, da ich nicht verstehe, warum nicht
EdChum
1
Warum nicht df.['a'].value_counts().reset_index()statt verwenden df.groupby('a')['a'].transform('count')?
Tandem
1
@tandem, sie machen verschiedene Dinge, das Aufrufen value_countsgeneriert eine Häufigkeitszählung. Wenn Sie das Ergebnis als neue Spalte zu Ihrem ursprünglichen df hinzufügen möchten, müssen Sie es transformwie in meiner Antwort beschrieben verwenden.
EdChum
93
Wenn Sie auf alle Spalten anwenden möchten, können Sie Folgendes verwenden:
df.apply(pd.value_counts)
Dadurch wird auf jede Spalte eine spaltenbasierte Aggregationsfunktion (in diesem Fall value_counts) angewendet.
Dies ist die einfachste Antwort. Dies sollte oben sein.
Jeffrey Jose
4
Diese Antwort ist einfach, aber (ich glaube) die applyOperation nutzt nicht die Vorteile, die vektorisierte Numpy-Arrays als Spalten bieten. Infolgedessen kann die Leistung bei größeren Datenmengen ein Problem darstellen.
Kuanb
58
df.category.value_counts()
Diese kurze kleine Codezeile gibt Ihnen die gewünschte Ausgabe.
Wenn Ihr Spaltenname Leerzeichen enthält, können Sie diese verwenden
Dies gibt Ihnen eine schöne Tabelle mit Wertzählungen und ein bisschen mehr :):
client hotel currency ota user_country
count 852845852845852845852845852845
unique 25541747713214219
top 219813202 USD Hades US
freq 1025628847516500242734340992
@metatoaster hat bereits darauf hingewiesen. Gehen Sie für Counter. Es ist blitzschnell.
import pandas as pd
from collections importCounterimport timeit
import numpy as np
df = pd.DataFrame(np.random.randint(1,10000,(100,2)), columns=["NumA","NumB"])
Timer
%timeit -n 10000 df['NumA'].value_counts()# 10000 loops, best of 3: 715 µs per loop%timeit -n 10000 df['NumA'].value_counts().to_dict()# 10000 loops, best of 3: 796 µs per loop%timeit -n 10000Counter(df['NumA'])# 10000 loops, best of 3: 74 µs per loop%timeit -n 10000 df.groupby(['NumA']).count()# 10000 loops, best of 3: 1.29 ms per loop
collections.Counter
df["category"].value_counts()
?type(df['category'].value_counts())
und es wird so sagenAntworten:
Verwenden Sie
groupby
undcount
:Siehe die Online-Dokumente: http://pandas.pydata.org/pandas-docs/stable/groupby.html
Auch
value_counts()
wie @DSM kommentiert hat, gibt es hier viele Möglichkeiten, eine Katze zu häutenWenn Sie dem ursprünglichen Datenrahmen wieder Frequenz hinzufügen möchten, verwenden Sie Folgendes
transform
, um einen ausgerichteten Index zurückzugeben:quelle
df.['a'].value_counts().reset_index()
statt verwendendf.groupby('a')['a'].transform('count')
?value_counts
generiert eine Häufigkeitszählung. Wenn Sie das Ergebnis als neue Spalte zu Ihrem ursprünglichen df hinzufügen möchten, müssen Sie estransform
wie in meiner Antwort beschrieben verwenden.Wenn Sie auf alle Spalten anwenden möchten, können Sie Folgendes verwenden:
Dadurch wird auf jede Spalte eine spaltenbasierte Aggregationsfunktion (in diesem Fall value_counts) angewendet.
quelle
apply
Operation nutzt nicht die Vorteile, die vektorisierte Numpy-Arrays als Spalten bieten. Infolgedessen kann die Leistung bei größeren Datenmengen ein Problem darstellen.Diese kurze kleine Codezeile gibt Ihnen die gewünschte Ausgabe.
Wenn Ihr Spaltenname Leerzeichen enthält, können Sie diese verwenden
quelle
df['category 1'].value_counts()
value_counts - Gibt ein Objekt zurück, das die Anzahl der eindeutigen Werte enthält
anwenden - Häufigkeit in jeder Spalte zählen. Wenn Sie einstellen
axis=1
, erhalten Sie die Frequenz in jeder Zeilefillna (0) - macht die Ausgabe ausgefallener. NaN wurde auf 0 geändert
quelle
In 0.18.1
groupby
zusammen mitcount
gibt nicht die Häufigkeit eindeutiger Werte an:Die eindeutigen Werte und ihre Häufigkeiten können jedoch leicht bestimmt werden mit
size
:Bei
df.a.value_counts()
sortierten Werten (in absteigender Reihenfolge, dh größter Wert zuerst) werden standardmäßig zurückgegeben.quelle
Verwenden von Listenverständnis und value_counts für mehrere Spalten in einer df
https://stackoverflow.com/a/28192263/786326
quelle
Wenn Ihre Datenrahmen Werte mit dem gleichen Typ hat, können Sie auch festlegen
return_counts=True
in numpy.unique () .index, counts = np.unique(df.values,return_counts=True)
np.bincount () kann schneller sein, wenn Ihre Werte Ganzzahlen sind.
quelle
Ohne Bibliotheken könnten Sie dies stattdessen tun:
Beispiel:
quelle
Sie können dies auch mit Pandas tun, indem Sie Ihre Spalten zuerst als Kategorien senden,
dtype="category"
zund dann anrufen
describe
:Dies gibt Ihnen eine schöne Tabelle mit Wertzählungen und ein bisschen mehr :):
quelle
Erste eindeutige Wertzählung
Zweite eindeutige Wertanzahl
Ausgabe:
Ausgabe:
quelle
@metatoaster hat bereits darauf hingewiesen. Gehen Sie für
Counter
. Es ist blitzschnell.Timer
Prost!
quelle
Verwenden Sie diesen Code:
quelle
Lösung:
quelle
Ich glaube, dass dies für jede DataFrame-Spaltenliste gut funktionieren sollte.
Die Funktion "column_list" überprüft die Spaltennamen und anschließend die Eindeutigkeit der einzelnen Spaltenwerte.
quelle