Подсчитайте частоту, в которой происходит значение в столбце dataframe

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

|category|
cat a
cat b
cat a

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

category | freq |
cat a       2
cat b       1

Ответ 1

Используйте 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]

Ответ 2

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

df.apply(pd.value_counts)

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

Ответ 3

df.category.value_counts()

Эта короткая строчка кода даст вам желаемый результат.

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

df['category'].value_counts()

Ответ 4

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

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

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

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

Ответ 5

В 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() по умолчанию возвращаются отсортированные значения (в порядке убывания, то есть наибольшее значение).

Ответ 6

код:

df = pd.DataFrame({'a':list('tuhimerisabhain')})
df.a.value_counts()

>>> df.a.value_counts()
i    3
h    2
a    2
n    1
b    1
m    1
r    1
t    1
e    1
u    1
s    1

Ответ 7

Использование подсчета списков и значений_значений для нескольких столбцов в df

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

fooobar.com/questions/75677/...

Ответ 8

Я бы использовал это для pandas v0.19.2:

df.category.value_counts()

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

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}

Ответ 12

Вы также можете использовать:

df = pd.DataFrame({'a':list('abssbab')})
df['a'].value_counts()

Ответ 13

Используйте метод size():

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

Ответ 14

Вы также можете сделать это с пандами, передавая ваши колонки как категории в первую очередь, например, 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

Ответ 15

n_values = data.income.value_counts()

Первый уникальный счетчик значений

n_at_most_50k = n_values[0]

Второй уникальный счетчик значений

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)

Ответ 16

@metatoaster уже указал на это. Перейти на Counter. Это быстро.

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

Таймеры

%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

Ура!

Ответ 17

Используйте этот код:

import numpy as np
np.unique(df['a'],return_counts=True)

Ответ 18

your data:

|category|
cat a
cat b
cat a

решение:

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

Ответ 19

df.category.value_counts() - это самый простой способ расчета

Ответ 20

Я считаю, что это должно работать нормально для любого списка столбцов DataFrame.

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" проверяет имена столбцов, а затем проверяет уникальность значений каждого столбца.