Как получить номер наиболее частого значения в столбце?
У меня есть кадр данных, и я хотел бы знать, сколько раз данный столбец имеет наиболее частое значение.
Я пытаюсь сделать это следующим образом:
items_counts = df['item'].value_counts()
max_item = items_counts.max()
В результате я получаю:
ValueError: cannot convert float NaN to integer
Насколько я понимаю, с первой строкой я получаю серию, в которой значения из столбца используются в качестве ключа, а частота этих значений используется как значения. Итак, мне просто нужно найти наибольшее значение в серии, и по какой-то причине это не сработает. Кто-нибудь знает, как эта проблема может быть решена?
Ответы
Ответ 1
Похоже, что у вас могут быть некоторые нули в столбце. Вы можете оставить их с помощью df = df.dropna(subset=['item'])
. Затем df['item'].value_counts().max()
должен дать вам максимальные значения, а df['item'].value_counts().idxmax()
должен дать вам наиболее частое значение.
Ответ 2
Вы также можете использовать функцию scipy mode
, которая игнорирует NaN. Решение, использующее его, может выглядеть так:
from scipy.stats import mode
from numpy import nan
df = DataFrame({"a": [1,2,2,4,2], "b": [nan, nan, nan, 3, 3]})
print mode(df)
Результат будет выглядеть как
(array([[ 2., 3.]]), array([[ 3., 2.]]))
означает, что наиболее распространенными значениями являются 2
для первых столбцов и 3
для второго, с частотами 3
и 2
соответственно.
Ответ 3
Чтобы продолжить ответ @jonathanrocher, вы можете использовать mode
в pandas DataFrame. Он будет давать самые частые значения (один или два) по строкам или столбцам:
import pandas as pd
import numpy as np
df = pd.DataFrame({"a": [1,2,2,4,2], "b": [np.nan, np.nan, np.nan, 3, 3]})
In [2]: df.mode()
Out[2]:
a b
0 2 3.0
Ответ 4
Просто возьмите первый ряд вашей серии items_counts
:
top = items_counts.head(1) # or items_counts.iloc[[0]]
value, count = top.index[0], top.iat[0]
Это работает, потому что pd.Series.value_counts
имеет sort=True
по умолчанию и поэтому уже упорядочено по количеству, сначала самое высокое число. Извлечение значения из индекса по местоположению имеет сложность O (1), в то время как pd.Series.idxmax
имеет сложность O (n), где n - количество категорий.
Указание sort=False
все еще возможно, и тогда рекомендуется idxmax
:
items_counts = df['item'].value_counts(sort=False)
top = items_counts.loc[[items_counts.idxmax()]]
value, count = top.index[0], top.iat[0]
Обратите внимание, что в этом случае вам не нужно вызывать max
и idxmax
отдельности, просто извлеките индекс через idxmax
и idxmax
в индексатор на основе меток loc
.
Ответ 5
Добавьте эту строку кода, чтобы найти наиболее частое значение
df["item"].value_counts().nlargest(n=1).values[0]