Kiedy używasz „df [” category ”]. Value_counts ()”, mówi, że to int? ale zwraca nazwę kolumny jako indeks? Czy jest to obiekt ramki danych, czy w jakiś sposób łączy serię (liczby) i oryginalne unikalne wartości kolumn?
yoshiserry
@yoshiserry to jest seria Pandas type(df['category'].value_counts())i tak powie
EdChum
Zrobiłem to i byłem tym zaskoczony, ale im więcej o tym myślę, ma to sens. Po wykonaniu tej czynności wartość liczy się dla niektórych kolumn, są wiersze, które chciałbym wykluczyć. Wiem, jak usunąć kolumny, ale jak wykluczyć wiersze?
yoshiserry
Odpowiedzi:
413
Użyj groupbyi 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]
@ yoshiserry Nie, widzisz, że tworzy serię, która jest wyrównana z oryginalną ramką danych, w przeciwieństwie do innych metod, które wyświetlają unikalne wartości i ich częstotliwość, jeśli chcesz po prostu dodać licznik częstotliwości z powrotem do ramki danych, dla której możesz użyć transformacji to. To tylko kolejna technika, zauważasz, że nie zwinął ramki danych po przypisaniu z powrotem i nie ma brakujących wartości. Myślę też, że Dataframes zawsze mają indeks. Nie sądzę, że można się go pozbyć, wystarczy go zresetować, przypisać nowy lub użyć kolumny jako indeksu
EdChum
4
W pierwszym przykładzie kodu df jest przypisywany zgodnie z oczekiwaniami, ale ten wiersz: df.groupby ('a'). Count () zwraca pustą ramkę danych. Czy to możliwe, że ta odpowiedź jest nieaktualna w przypadku pand 0.18.1? Trochę mylące jest również to, że nazwa kolumny „a” jest taka sama, jak szukana wartość „a”. Zrobiłbym to sam, ale ponieważ kod nie działa dla mnie, nie mogę być pewien moich zmian.
Alex
1
@Alex masz rację, wygląda na to, że w najnowszych wersjach to już nie działa, wydaje mi się błędem, ponieważ nie rozumiem, dlaczego nie
EdChum
1
Dlaczego nie użyć df.['a'].value_counts().reset_index()zamiast df.groupby('a')['a'].transform('count')?
tandem
1
@ tandem, robią różne rzeczy, wywołanie value_countswygeneruje licznik częstotliwości, jeśli chcesz dodać wynik z powrotem jako nową kolumnę do oryginalnego pliku df, to musisz użyć, transformjak opisano w mojej odpowiedzi.
EdChum,
93
Jeśli chcesz zastosować do wszystkich kolumn, możesz użyć:
df.apply(pd.value_counts)
Spowoduje to zastosowanie funkcji agregacji opartej na kolumnach (w tym przypadku value_counts) do każdej kolumny.
To najprostsza odpowiedź. To powinno być na górze.
Jeffrey Jose
4
Ta odpowiedź jest prosta, ale (jak sądzę) applyoperacja nie wykorzystuje zalet, które wektoryzowały tablice Numpy, jak zapewniają kolumny. W rezultacie wydajność może stanowić problem w przypadku większych zestawów danych.
kuanb
58
df.category.value_counts()
Ten krótki wiersz kodu daje pożądane wyniki.
Jeśli nazwa kolumny zawiera spacje, których możesz użyć
To da ci fajną tabelę wartości i trochę więcej :):
client hotel currency ota user_country
count 852845852845852845852845852845
unique 25541747713214219
top 219813202 USD Hades US
freq 1025628847516500242734340992
@metatoaster już to zauważył. Idź do Counter. Płonie szybko.
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"])
Timery
%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())
i tak powieOdpowiedzi:
Użyj
groupby
icount
:Zobacz dokumenty online: http://pandas.pydata.org/pandas-docs/stable/groupby.html
Również
value_counts()
jako @DSM skomentował, wiele sposobów na skórę kota tutajJeśli chcesz dodać częstotliwość z powrotem do oryginalnej ramki danych, użyj przycisku,
transform
aby zwrócić wyrównany indeks:źródło
df.['a'].value_counts().reset_index()
zamiastdf.groupby('a')['a'].transform('count')
?value_counts
wygeneruje licznik częstotliwości, jeśli chcesz dodać wynik z powrotem jako nową kolumnę do oryginalnego pliku df, to musisz użyć,transform
jak opisano w mojej odpowiedzi.Jeśli chcesz zastosować do wszystkich kolumn, możesz użyć:
Spowoduje to zastosowanie funkcji agregacji opartej na kolumnach (w tym przypadku value_counts) do każdej kolumny.
źródło
apply
operacja nie wykorzystuje zalet, które wektoryzowały tablice Numpy, jak zapewniają kolumny. W rezultacie wydajność może stanowić problem w przypadku większych zestawów danych.Ten krótki wiersz kodu daje pożądane wyniki.
Jeśli nazwa kolumny zawiera spacje, których możesz użyć
źródło
df['category 1'].value_counts()
value_counts - Zwraca obiekt zawierający liczbę unikalnych wartości
zastosowanie - policz częstotliwość w każdej kolumnie. Jeśli ustawisz
axis=1
, otrzymasz częstotliwość w każdym rzędziefillna (0) - spraw, aby wyjście było bardziej fantazyjne. Zmieniono NaN na 0
źródło
W 0.18.1
groupby
razem zcount
nie podaje częstotliwości unikalnych wartości:Jednak unikalne wartości i ich częstotliwości można łatwo ustalić za pomocą
size
:W przypadku
df.a.value_counts()
wartości posortowanych (w kolejności malejącej, tzn. Najpierw największej wartości) zwracane są domyślnie.źródło
Korzystanie ze zrozumienia listy i wartości_liczb dla wielu kolumn w pliku df
https://stackoverflow.com/a/28192263/786326
źródło
Jeśli twoja DataFrame ma wartości tego samego typu, możesz również ustawić
return_counts=True
w numpy.unique () .index, counts = np.unique(df.values,return_counts=True)
np.bincount () może być szybszy, jeśli twoje wartości są liczbami całkowitymi.
źródło
Bez bibliotek możesz to zrobić zamiast:
Przykład:
źródło
Możesz to również zrobić z pandami, nadając najpierw swoje kolumny jako kategorie, np.
dtype="category"
Npa następnie dzwoniąc
describe
:To da ci fajną tabelę wartości i trochę więcej :):
źródło
Liczy się pierwsza unikalna wartość
Liczy się druga unikalna wartość
Wynik:
Wynik:
źródło
@metatoaster już to zauważył. Idź do
Counter
. Płonie szybko.Timery
Twoje zdrowie!
źródło
Użyj tego kodu:
źródło
rozwiązanie:
źródło
Uważam, że powinno to działać poprawnie dla każdej listy kolumn DataFrame.
Funkcja „lista_kolumnowa” sprawdza nazwy kolumn, a następnie sprawdza unikalność każdej wartości kolumny.
źródło