如何获取一列中最频繁出现的值?

问题描述 投票:47回答:6

我有一个数据框,我想知道给定列具有最频繁值的次数。

我尝试通过以下方式进行操作:

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

结果我得到:

ValueError: cannot convert float NaN to integer

据我了解,在第一行中,我得到了一系列,其中列中的值用作键,而这些值的频率用作值。因此,我只需要在系列中找到最大的值,由于某种原因,它不起作用。有人知道如何解决这个问题吗?

python pandas counter frequency series
6个回答
61
投票

似乎您在该列中可能有一些空值。您可以使用df = df.dropna(subset=['item'])删除它们。然后,df['item'].value_counts().max()应该为您提供最大计数,df['item'].value_counts().idxmax()应该为您提供最频繁的值。


15
投票

要继续@jonathanrocher回答,您可以在pandas DataFrame中使用mode。它将在行或列中提供最频繁的值(一个或两个):

mode

12
投票

[您也可以考虑使用scipy的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 函数,该函数忽略NaN。使用它的解决方案可能看起来像:

mode

输出看起来像

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,分别是频率33


2
投票

只需使用2系列的第一行:

items_counts

这是有效的,因为默认情况下top = items_counts.head(1) # or items_counts.iloc[[0]] value, count = top.index[0], top.iat[0] 的值为pd.Series.value_counts,所以按计数<>,首先是最高计数。按位置从索引中提取值的复杂度为O(1),而pd.Series.value_counts的复杂度为O(n),其中n是类别数。仍然可以指定sort=True,然后建议pd.Series.idxmax

pd.Series.idxmax

在这种情况下,请注意,您不需要分别调用sort=Falseidxmax,只需通过items_counts = df['item'].value_counts(sort=False)
top = items_counts.loc[[items_counts.idxmax()]]
value, count = top.index[0], top.iat[0]
提取索引,并将其输入基于标签的max索引器即可。

1
投票
添加此行代码以查找最频繁的值

0
投票

>>代码:

© www.soinside.com 2019 - 2024. All rights reserved.