56

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

我尝试通过以下方式做到这一点:

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

结果我得到:

ValueError: cannot convert float NaN to integer

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

4

6 回答 6

74

看起来您的列中可能有一些空值。你可以用df = df.dropna(subset=['item']). 然后df['item'].value_counts().max()应该给你最大计数,并且df['item'].value_counts().idxmax()应该给你最频繁的值。

于 2013-02-28T15:43:31.177 回答
19

要继续@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
于 2017-05-11T05:05:00.153 回答
13

您也可以考虑使用mode忽略 NaN 的 scipy 函数。使用它的解决方案可能如下所示:

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

于 2015-05-05T22:00:49.557 回答
2

只需获取items_counts系列的第一行:

top = items_counts.head(1)  # or items_counts.iloc[[0]]
value, count = top.index[0], top.iat[0]

这是有效的,因为默认情况下pd.Series.value_countshas已经按计数排序,最高计数优先。按位置从索引中提取值具有 O(1) 复杂度,而具有 O( n ) 复杂度,其中n是类别数。sort=Truepd.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]

请注意,在这种情况下,您不需要单独调用maxand idxmax,只需通过提取索引idxmax并将其提供给loc基于标签的索引器即可。

于 2019-02-03T13:55:49.293 回答
1

计算频率时省略了 NaN 值。 请在此处检查您的代码功能 但您可以使用以下代码实现相同的功能。

**>> 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)]
于 2020-05-01T10:37:42.127 回答
1

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

df["item"].value_counts().nlargest(n=1).values[0]
于 2019-06-09T00:22:26.553 回答