我有一个数据框,我想知道给定列具有最频繁值的次数。
我尝试通过以下方式进行操作:
items_counts = df['item'].value_counts()
max_item = items_counts.max()
结果我得到:
ValueError: cannot convert float NaN to integer
据我了解,在第一行中,我得到了一系列,其中列中的值用作键,而这些值的频率用作值。因此,我只需要在系列中找到最大的值,由于某种原因,它不起作用。有人知道如何解决这个问题吗?
似乎您在该列中可能有一些空值。您可以使用df = df.dropna(subset=['item'])
删除它们。然后,df['item'].value_counts().max()
应该为您提供最大计数,df['item'].value_counts().idxmax()
应该为您提供最频繁的值。
要继续@jonathanrocher回答,您可以在pandas DataFrame中使用mode
。它将在行或列中提供最频繁的值(一个或两个):
mode
[您也可以考虑使用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
,分别是频率3
和3
。
只需使用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=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
索引器即可。
>>代码: