bir veri çerçevesi sütununda bir değerin oluşma sıklığını sayma


313

Veri setim var

|category|
cat a
cat b
cat a

(Benzersiz değerleri ve sıklığı gösteren) gibi bir şey döndürmek istiyorum

category | freq |
cat a       2
cat b       1



"Df [" category "]. Value_counts ()" kullanırken onun int? ancak sütun adını dizin olarak döndürür? Bir veri çerçevesi nesnesi mi yoksa bir şekilde bir seriyi (sayıları) ve orijinal benzersiz sütun değerlerini birleştiriyor mu?
yoshiserry

@yoshiserry bir Pandalar serisinin yaptığı type(df['category'].value_counts())ve söyleyecek
EdChum

Yaptım ve çok şaşırdım ama daha çok düşündüğümde mantıklı geliyor. Bunu yaptıktan sonra, bazı sütunlarda değer sayar, hariç tutmak istediğim satırlar var. Sütunları nasıl kaldıracağımı biliyorum ama satırları nasıl hariç tutabilirim?
yoshiserry

Yanıtlar:


414

Kullanın groupbyve 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]

Çevrimiçi dokümanlara bakın: http://pandas.pydata.org/pandas-docs/stable/groupby.html

Ayrıca value_counts()@DSM'nin yorumladığı gibi, burada bir kedinin derisini almanın birçok yolu

In [38]:
df['a'].value_counts()

Out[38]:

b    3
a    2
s    2
dtype: int64

Orijinal veri çerçevesine frekans geri eklemek istiyorsanız transform, hizalanmış bir dizin döndürmek için kullanın :

In [41]:
df['freq'] = df.groupby('a')['a'].transform('count')
df

Out[41]:

   a freq
0  a    2
1  b    3
2  s    2
3  s    2
4  b    3
5  a    2
6  b    3

[7 rows x 2 columns]

@yoshiserry Hayır, gördüğünüz şey, benzersiz veriyi ve frekanslarını gösteren diğer yöntemlerin aksine, orijinal veri çerçevesiyle uyumlu bir seri oluşturmasıdır, eğer sadece veri karesine frekans sayımı eklemek istiyorsanız, dönüşümü kullanabilirsiniz bu. Bu sadece başka bir tekniktir, geri atadıktan sonra veri çerçevesini daraltmadığını ve eksik değer olmadığını fark edersiniz. Ayrıca Dataframes her zaman bir dizin var sanmıyorum ondan kurtulmak, sadece sıfırlamak, yeni bir atamak veya bir sütun bir dizin olarak kullanmak
EdChum

4
İlk kod örneğinizde, df beklendiği gibi atanır, ancak bu satır: df.groupby ('a'). Count () boş bir veri çerçevesi döndürür. Bu cevabın 0.18.1 pandalarla güncel olmaması mümkün mü? Ayrıca, 'a' sütun adınızın 'a' için aradığınız değerle aynı olması biraz kafa karıştırıcıdır. Kendim düzenlerdim ama kod benim için çalışmadığından düzenlemelerimden emin olamıyorum.
Alex

1
@Alex en son sürümlerde artık bu işe yaramıyor gibi görünüyor, neden göremiyorum gibi bana bir hata gibi görünüyor
EdChum

1
Neden df.['a'].value_counts().reset_index()yerine kullanmıyorsunuz df.groupby('a')['a'].transform('count')?
tandem

1
@tandem, farklı şeyler yaparlar, arama value_countsbir frekans sayımı oluşturur, sonucu orijinal df'nize karşı yeni bir sütun olarak geri eklemek isterseniz, cevabımda transformayrıntılı olarak kullanmanız gerekir .
EdChum

93

Tüm sütunlara uygulamak istiyorsanız şunları kullanabilirsiniz:

df.apply(pd.value_counts)

Bu, sütunların her birine sütun tabanlı bir toplama işlevi (bu durumda value_counts) uygular.


10
Bu en basit cevap. Bu en üstte olmalıdır.
Jeffrey Jose

4
Bu cevap basitçe ancak (inanıyorum) applyoperasyonun Numpy dizilerini sütun olarak sağladığı vektörlerden faydalanmıyor. Sonuç olarak, performans daha büyük veri kümelerinde bir sorun olabilir.
kuanb

58
df.category.value_counts()

Bu kısa kod satırı size istediğiniz çıktıyı verecektir.

Sütun adınızda boşluklar varsa kullanabilirsiniz

df['category'].value_counts()

2
Veya sütun adında boşluk varsa [] kullanın . df['category 1'].value_counts()
Jacob Kalakal Joseph

19
df.apply(pd.value_counts).fillna(0)

value_counts - Benzersiz değerlerin sayısını içeren nesneyi döndürür

Uygula - her sütundaki sayım sıklığı. Eğer ayarlarsanız axis=1, her satırda frekansı olsun

fillna (0) - çıktıyı daha süslü hale getirir. NaN değeri 0 olarak değiştirildi


1
Bu, aynı satır için sütunlar arasında bir değerin oluşumlarını sayarken çok güçlü !!
amc

14

0.18.1 ile groupbybirlikte countbenzersiz değerlerin sıklığını vermez:

>>> df
   a
0  a
1  b
2  s
3  s
4  b
5  a
6  b

>>> df.groupby('a').count()
Empty DataFrame
Columns: []
Index: [a, b, s]

Bununla birlikte, benzersiz değerler ve frekansları aşağıdakiler kullanılarak kolayca belirlenir size:

>>> df.groupby('a').size()
a
a    2
b    3
s    2

İle df.a.value_counts()sıralı değerler (azalan sırayla, ilk yani büyük değer) varsayılan olarak döndürülür.



5

DataFrame'iniz aynı türde değerlere sahipse, numpy.unique ()return_counts=True içinde de ayarlayabilirsiniz .

index, counts = np.unique(df.values,return_counts=True)

Değerleriniz tamsayı ise np.bincount () daha hızlı olabilir.


4

Herhangi bir kütüphane olmadan bunu yapabilirsiniz:

def to_frequency_table(data):
    frequencytable = {}
    for key in data:
        if key in frequencytable:
            frequencytable[key] += 1
        else:
            frequencytable[key] = 1
    return frequencytable

Misal:

to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}

1

Bunu, ilk önce sütunlarınızı kategori olarak yayınlayarak pandalarla da yapabilirsiniz, dtype="category"örn.

cats = ['client', 'hotel', 'currency', 'ota', 'user_country']

df[cats] = df[cats].astype('category')

ve sonra describe:

df[cats].describe()

Bu size güzel bir değer sayı tablosu ve biraz daha fazlasını verecektir :):

    client  hotel   currency    ota user_country
count   852845  852845  852845  852845  852845
unique  2554    17477   132 14  219
top 2198    13202   USD Hades   US
freq    102562  8847    516500  242734  340992

0
n_values = data.income.value_counts()

İlk benzersiz değer sayısı

n_at_most_50k = n_values[0]

İkinci benzersiz değer sayısı

n_greater_50k = n_values[1]

n_values

Çıktı:

<=50K    34014
>50K     11208

Name: income, dtype: int64

Çıktı:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

0

@metatoaster bunu zaten belirtti. Git Counter. Hızlı yanıp sönüyor.

import pandas as pd
from collections import Counter
import timeit
import numpy as np

df = pd.DataFrame(np.random.randint(1, 10000, (100, 2)), columns=["NumA", "NumB"])

Zamanlayıcılar

%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 10000 Counter(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

Şerefe!



0
your data:

|category|
cat a
cat b
cat a

çözüm:

 df['freq'] = df.groupby('category')['category'].transform('count')
 df =  df.drop_duplicates()

0

Bunun herhangi bir DataFrame sütun listesi için iyi çalışması gerektiğine inanıyorum.

def column_list(x):
    column_list_df = []
    for col_name in x.columns:
        y = col_name, len(x[col_name].unique())
        column_list_df.append(y)
return pd.DataFrame(column_list_df)

column_list_df.rename(columns={0: "Feature", 1: "Value_count"})

"Column_list" işlevi sütun adlarını kontrol eder ve ardından her sütun değerinin benzersizliğini kontrol eder.


Yanıtınızı geliştirmek için kodunuzun nasıl çalıştığına dair kısa bir açıklama ekleyebilirsiniz.
DobromirM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.