подсчитайте частоту появления значения в столбце фрейма данных



у меня есть набор данных



|category|
cat a
cat b
cat a


Я хотел бы иметь возможность вернуть что-то вроде (показывая уникальные значения и частоту)



category | freq |
cat a 2
cat b 1
620   12  

12 ответов:

использовать groupby и 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]

смотрите онлайн-документы:http://pandas.pydata.org/pandas-docs/stable/groupby.html

и value_counts() как прокомментировал @DSM, здесь много способов освежевать кошку

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

Out[38]:

b    3
a    2
s    2
dtype: int64

если вы хотите добавить частоту обратно в исходный фрейм данных используйте transform чтобы вернуть выровненный индекс:

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]

Если вы хотите применить ко всем столбцам можно использовать:

df.apply(pd.value_counts)

к каждому столбцу будет применена функция агрегации на основе столбцов (в данном случае value_counts).

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

value_counts - возвращает объект, содержащий количество уникальных значений

применить - частота отсчета в каждом столбце. Если вы установите axis=1, вы получите frequncy в каждой строке

fillna (0) - сделать вывод более причудливым. Изменен NaN на 0

df.category.value_counts()

эта короткая строка кода даст вам выход, который вы хотите.

в 0.18.1 groupby вместе с count не дает частоты уникальных значений:

>>> 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]

однако уникальные значения и их частоты легко определяются с помощью size:

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

С df.a.value_counts() по умолчанию возвращаются отсортированные значения (в порядке убывания, т. е. сначала наибольшее значение).

использование списка понимания и value_counts для нескольких столбцов в df

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

https://stackoverflow.com/a/28192263/786326

Если ваш фрейм данных имеет значения с тем же типом, вы также можете установить return_counts=True на numpy.уникальный().

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

np.bincount () может быть быстрее, если ваши значения являются целыми числами.

без каких-либо библиотек, вы могли бы сделать это вместо:

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

пример:

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

Это должно работать:

df.groupby('category').size()

использовать метод size ():

    import pandas as pd
    print df.groupby['category'].size()
    #where df is your dataframe

вы также можете сделать это с пандами, транслируя свои столбцы в качестве категорий, например,dtype="category" например

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

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

а потом звонит describe:

df[cats].describe()

Это даст вам хорошую таблицу подсчетов значений и немного больше :):

    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
n_values = data.income.value_counts()

первое уникальное значение count

n_at_most_50k = n_values[0]

второе уникальное значение count

n_greater_50k = n_values[1]

n_values

выход:

<=50K    34014
>50K     11208

Name: income, dtype: int64

выход:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

Comments

    Ничего не найдено.