Подтвердить что ты не робот

Как получить номер наиболее частого значения в столбце?

У меня есть кадр данных, и я хотел бы знать, сколько раз данный столбец имеет наиболее частое значение.

Я пытаюсь сделать это следующим образом:

items_counts = df['item'].value_counts()
max_item = items_counts.max()

В результате я получаю:

ValueError: cannot convert float NaN to integer

Насколько я понимаю, с первой строкой я получаю серию, в которой значения из столбца используются в качестве ключа, а частота этих значений используется как значения. Итак, мне просто нужно найти наибольшее значение в серии, и по какой-то причине это не сработает. Кто-нибудь знает, как эта проблема может быть решена?

4b9b3361

Ответ 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]