При использовании "df [" category "]. Value_counts ()" он говорит, что это int? но он возвращает имя столбца в качестве индекса? Это объект dataframe или он как-то объединяет ряд (количество) и исходные уникальные значения столбца?
yoshiserry
@yoshiserry, это серия Панд, type(df['category'].value_counts())и она скажет так
EdChum
Я сделал, и я был удивлен этим, но это имеет смысл, чем больше я думаю об этом. После этого значение рассчитывается в некоторых столбцах, есть строки, которые я бы хотел исключить. Я знаю, как удалить столбцы, но как исключить строки?
yoshiserry
Ответы:
414
Используйте 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]
@yoshiserry Нет, вы видите, что он создает серию, которая выравнивается с исходным кадром данных, в отличие от других методов, которые отображают уникальные значения и их частоту, если вы хотите просто добавить подсчет частоты обратно к кадру данных, вы можете использовать преобразование для этот. Это просто еще один метод, вы заметили, что он не свернул информационный фрейм после присваивания, и пропущенные значения отсутствуют. Также я думаю, что у Dataframes всегда есть индекс, я не думаю, что вы можете от него избавиться, только сбросить его, назначить новый или использовать столбец в качестве индекса
EdChum
4
В вашем первом примере кода df назначается как ожидалось, но эта строка: df.groupby ('a'). Count () возвращает пустой фрейм данных. Возможно ли, что этот ответ устарел с пандами 0.18.1? Также немного сбивает с толку то, что имя вашего столбца «a» совпадает со значением, которое вы ищете «a». Я бы отредактировал его сам, но так как код не работает для меня, я не уверен в своих изменениях.
Алекс
1
@ Алекс, ты прав, похоже, в последних версиях это больше не работает, мне кажется, что это ошибка, потому что я не понимаю, почему нет
EdChum
1
Почему бы не использовать df.['a'].value_counts().reset_index()вместо df.groupby('a')['a'].transform('count')?
тандем
1
@tandem, они делают разные вещи, вызов value_countsбудет генерировать счетчик частоты, если вы хотите добавить результат обратно в виде нового столбца против вашего исходного df, то вам придется использовать, transformкак описано в моем ответе.
EdChum
93
Если вы хотите применить ко всем столбцам, вы можете использовать:
df.apply(pd.value_counts)
Это позволит применить функцию агрегирования на основе столбцов (в данном случае value_counts) к каждому из столбцов.
Этот ответ прост, но (я полагаю) applyоперация не использует преимущества, которые векторизовывает массивы Numpy в виде столбцов. В результате производительность может быть проблемой для больших наборов данных.
17
58
df.category.value_counts()
Эта короткая строчка кода даст вам желаемый результат.
Если в имени вашего столбца есть пробелы, вы можете использовать
Это даст вам хорошую таблицу значений и немного больше :):
client hotel currency ota user_country
count 852845852845852845852845852845
unique 25541747713214219
top 219813202 USD Hades US
freq 1025628847516500242734340992
@metatoaster уже указал на это. Перейти на Counter. Это пылает быстро.
import pandas as pd
from collections importCounterimport 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 10000Counter(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
collections.Counter
df["category"].value_counts()
?type(df['category'].value_counts())
и она скажет такОтветы:
Используйте
groupby
иcount
:См. Онлайн-документы: http://pandas.pydata.org/pandas-docs/stable/groupby.html.
Также,
value_counts()
как прокомментировал @DSM, здесь можно найти много способов убрать кошку.Если вы хотите добавить частоту обратно к исходному фрейму данных, используйте
transform
для возврата выровненного индекса:источник
df.['a'].value_counts().reset_index()
вместоdf.groupby('a')['a'].transform('count')
?value_counts
будет генерировать счетчик частоты, если вы хотите добавить результат обратно в виде нового столбца против вашего исходного df, то вам придется использовать,transform
как описано в моем ответе.Если вы хотите применить ко всем столбцам, вы можете использовать:
Это позволит применить функцию агрегирования на основе столбцов (в данном случае value_counts) к каждому из столбцов.
источник
apply
операция не использует преимущества, которые векторизовывает массивы Numpy в виде столбцов. В результате производительность может быть проблемой для больших наборов данных.Эта короткая строчка кода даст вам желаемый результат.
Если в имени вашего столбца есть пробелы, вы можете использовать
источник
df['category 1'].value_counts()
value_counts - возвращает объект, содержащий количество уникальных значений
apply - считать частоту в каждом столбце. Если вы установите
axis=1
, вы получите частоту в каждом рядуfillna (0) - сделать вывод более модным. Изменен NaN на 0
источник
В 0.18.1
groupby
вместе сcount
не дает частоты уникальных значений:Однако уникальные значения и их частоты легко определяются с помощью
size
:С
df.a.value_counts()
отсортированными значениями (в порядке убывания, то есть сначала с наибольшим значением) возвращается по умолчанию.источник
Использование списка понимания и value_counts для нескольких столбцов в DF
https://stackoverflow.com/a/28192263/786326
источник
Если ваш DataFrame имеет значения того же типа, вы также можете установить его
return_counts=True
в numpy.unique () .index, counts = np.unique(df.values,return_counts=True)
np.bincount () может быть быстрее, если ваши значения целые.
источник
Без каких-либо библиотек вы могли бы сделать это вместо этого:
Пример:
источник
Вы также можете сделать это с пандами, сначала транслируя свои колонки в виде категорий,
dtype="category"
например:а затем позвонив
describe
:Это даст вам хорошую таблицу значений и немного больше :):
источник
Первый уникальный счетчик значений
Второй уникальный счетчик значений
Вывод:
Вывод:
источник
@metatoaster уже указал на это. Перейти на
Counter
. Это пылает быстро.Таймеры
Ура!
источник
Используйте этот код:
источник
решение:
источник
Я считаю, что это должно работать нормально для любого списка столбцов DataFrame.
Функция «column_list» проверяет имена столбцов, а затем проверяет уникальность значений каждого столбца.
источник