Взгляните на проект GROUP_CONCAT в Github, я думаю, что выполняю именно то, что вы ищете:
Этот проект содержит набор SQLCLR User- (SQLCLR UDA), которые совместно предлагают аналогичную функциональность функции MySQL GROUP_CONCAT. Существует множество функций для обеспечения максимальной производительности на основе требуемой функциональности ...
Используйте 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
[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
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)
Это должно работать:
df.groupby('category').size()
df.category.value_counts()
Эта короткая небольшая строка кода даст вам нужный вам результат.
Использовать метод size ():
import pandas as pd
print df.groupby['category'].size()
#where df is your dataframe
df.apply(pd.value_counts).fillna(0)
value_counts - возвращает объект, содержащий подсчет уникальных значений
apply - частота отсчета в каждом столбце. Если вы установите ось = 1, вы получите frequncy в каждой строке
fillna (0) - сделайте вывод более причудливым. Изменено NaN до 0
Без каких-либо библиотек вы можете сделать это вместо:
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}
Вы также можете сделать это с помощью панд, сначала передавая свои столбцы в качестве категорий, например. 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
Если ваш DataFrame имеет значения с одним и тем же типом, вы также можете установить return_counts=True
в numpy.unique () .
index, counts = np.unique(df.values,return_counts=True)
np.bincount () может быть быстрее, если ваши значения являются целыми числами.
В 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()
по умолчанию возвращаются отсортированные значения (в порядке убывания, т.е. наибольшее значение).