如何获取列中最频繁值的数量?

Posted

技术标签:

【中文标题】如何获取列中最频繁值的数量?【英文标题】:How to get the number of the most frequent value in a column? 【发布时间】:2013-02-14 20:19:30 【问题描述】:

我有一个数据框,我想知道给定列有多少次出现频率最高的值。

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

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

结果我得到:

ValueError: cannot convert float NaN to integer

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

【问题讨论】:

您的专栏中有na 吗?如果是这样,您应该使用 dropnafillna 摆脱它们。 【参考方案1】:

计算频率时省略了 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)]

【讨论】:

虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性! 除了上述评论之外,您的解决方案是唯一的非 Pandas 解决方案,因此您最好解释一下该解决方案如何提供帮助以及它如何处理 OP 的 NaN 问题。【参考方案2】:

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

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

【讨论】:

df["item"].value_counts().nlargest(n=1).index[1]【参考方案3】:

只需取您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]

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

【讨论】:

【参考方案4】:

要继续 @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

【讨论】:

你好,你能看看这个问题***.com/questions/70954791/…【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

而且...我可以这样做以便将 NA 计为一个值吗? IE。如果这是最常见的值,我很乐意返回 NA。 @FullDecent 使用.fillna() 而不是.dropna() 如果我想找到第二大的最大值,该怎么做? 使用df['item'].value_counts().nlargest(n=2).iloc[[2]] df['item'].value_counts().nlargest(n=2)..iloc[[1]].index[0]

以上是关于如何获取列中最频繁值的数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取列中多个最小值的索引?

如何获取列中每个不同值的计数? [复制]

如何获取列中每个值的计数?

如何使用 Linq 获取列中每个不同值的计数

火花数据集:如何从列中获取唯一值的出现次数

如何获取 DynamoDB 列中的最大数量?