2014-04-21 11 views
9

Mam dataframe z licznymi kolumnami (≈30) z zewnętrznego źródła (plik csv), ale kilka z nich nie ma wartości lub zawsze jest takie samo. Tak więc chciałbym szybko zobaczyć value_counts dla każdej kolumny, jak mogę to zrobić?pandy wartości_orazowe zastosowane do każdej kolumny

Na przykład

Id, temp, name 
1 34, null, mark 
2 22, null, mark 
3 34, null, mark 

Wrócimy mi obiekt stwierdzającą, że

  • Id: 34 -> 2, 22 -> 1
  • temp: null -> 3
  • nazwę : mark -> 3

Więc chciałbym wiedzieć, że temperatura jest Nazwa nieistotne i nie jest interesująca (zawsze takie same)

+0

pętli nad kolumnami i wydrukować 'value_counts' dla każdego ? – joris

+0

Co powiedział @joris. Jest [problem] (https://github.com/pydata/pandas/pull/5381) Aby dodać metodę "value_counts" do DataFrame, ale jest kilka problemów związanych z wyrównaniem indeksu. – TomAugspurger

Odpowiedz

9

Dla dataframe,

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

następujący kod

for c in df.columns: 
    print "---- %s ---" % c 
    print df[c].value_counts() 

przyniesie następujący wynik:

---- id --- 
34 2 
22 1 
dtype: int64 
---- temp --- 
null 3 
dtype: int64 
---- name --- 
mark 3 
dtype: int64 
+0

Dzięki za komentarze i odpowiedź. Myślałem, że można to zrobić bez pętli, ale wygląda na to, że tak nie jest. (i tak, widziałem już wspomniany problem, mam nadzieję, że wkrótce będzie to możliwe :)). – Edouard

+0

Właściwie, dlaczego nie zrobić tego na mapie takiej jak: mapa (lambda x: x.value_counts(), mdf.columns) – Edouard

3

ci może użyć df.apply, która zastosuje każdą kolumnę z podaną funkcją, w tym przypadku licząc brakująca wartość. To, co wygląda na to,

df.apply(lambda x: x.isnull().value_counts())

1

Jest to dobry sposób, aby to zrobić i wrócić serię ładnie formater jest łączenie pandas.Series.value_counts i pandas.DataFrame.stack.

Dla DataFrame

df = pandas.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

Można zrobić coś podobnego

df.apply(lambda x: x.value_counts()).T.stack() 

W tym kodzie df.apply(lambda x: x.value_counts()) dotyczy value_counts do każdej kolumny i dołącza go do powstałego DataFrame, więc skończyć z DataFrame z tymi samymi kolumnami i jednym rzędem na każdą inną wartość w każdej kolumnie (i dużą liczbą null dla każdej wartości, która nie pojawia się w każdej kolumnie).

Po tym, T transponuje DataFrame (więc skończyć z DataFrame z indeksem równym kolumn i kolumn równą możliwych wartości), a stack zamienia kolumn DataFrame do nowego poziomu z MultiIndex i "usuwa" wszystkie wartości Null, dzięki czemu całość jest Series.

Wynikiem tego jest

id 22  1 
     34  2 
temp null 3 
name mark 3 
dtype: float64 
0

kod jak poniżej

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=["id", 'temp', 'name'], index=[1, 2, 3]) 
result2 = df.apply(pd.value_counts) 
result2 

będzie produkować:

enter image description here

Powiązane problemy