如何获取列中最常值的数字?

时间:2013-02-28 15:11:19

标签: python pandas counter frequency series

我有一个数据框,我想知道给定列的次数最多的次数。

我尝试按以下方式进行:

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

结果我得到了:

ValueError: cannot convert float NaN to integer

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

6 个答案:

答案 0 :(得分:47)

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

答案 1 :(得分:11)

您也可以考虑使用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,频率分别为32

答案 2 :(得分:11)

要继续@jonathanrocher回答,您可以在pandas DataFrame中使用mode。它会在行或列中给出最常见的值(一个或两个):

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

答案 3 :(得分:1)

只需采用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 是类别数。< / p>

仍然可以指定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]

请注意,在这种情况下,您无需分别调用maxidxmax,只需通过idxmax提取索引并馈入基于标签的loc索引器

答案 4 :(得分:0)

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

df["item"].value_counts().nlargest(n=1).values[0]

答案 5 :(得分:0)

NaN值在计算频率时被省略。 Please check your code functionality here 但是您可以将以下代码用于相同的功能。

**>> Code:**
    # Importing required module
    from collections import Counter

    # Creating a dataframe
    df = pd.DataFrame({ 'A':["jan","jan","jan","mar","mar","feb","jan","dec",
                             "mar","jan","dec"]  }) 
    # Creating a counter object
    count = Counter(df['A'])
    # Calling a method of Counter object(count)
    count.most_common(3)

**>> Output:**

    [('jan', 5), ('mar', 3), ('dec', 2)]