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
в 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)]
Если ваш фрейм данных имеет значения с тем же типом, вы также можете установить
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}
использовать метод 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