Pandas获取某列最常见的值

109

我有这个数据框:

0 name data
1 alex asd
2 helen sdd
3 alex dss
4 helen sdsd
5 john sdadd

我正在尝试获取最常见的一个或多个值(在这种情况下是值)。 所以我的做法是:

dataframe['name'].value_counts().idxmax()

但它只返回值:Alex,即使它Helen也出现了两次。

18个回答

128

通过使用mode

df.name.mode()
Out[712]: 
0     alex
1    helen
dtype: object

1
嗯,我之前看过你使用模式 :) - Vaishali
2
@Vaishali 是的,这来自于scipy.mode,它会返回众数和个数。对于pd.mode,它只会返回值 :-) - BENY
有没有一种方法可以通过一个查询同时获取最频繁的值和它的索引? - user2348209
@user2348209 你可以这样做,但不建议使用 df.reset_index().groupby(df['name'])['index'].agg(list).loc[lambda x : x.str.len() ==x.str.len().max()] - BENY

89
要获取最常见的n个值,只需要对`.value_counts()`进行子集操作并获取索引:
# get top 10 most frequent names
n = 10
dataframe['name'].value_counts()[:n].index.tolist()

1
添加.index究竟是做什么的?为什么我不能等到[:n]再加它呢? - user1953366
2
返回的数据结构将在索引中存储“名称”值,并将其相应的计数存储为值。因此,如果您没有使用索引,您将得到最常见计数的列表,而不是相关的“名称”。 - Jared Wilber

18

你可以尝试使用如下的 argmax 方法:

dataframe['name'].value_counts().argmax() Out[13]: 'alex'

value_counts 方法会返回一个 pandas.core.series.Series 的计数对象,而 argmax 方法则可以用于获取最大值对应的键。


2
argmax is deprecated for idmax - Bhoomtawath Plinsut
5
仅需进行小的更正:不是 idmax,而是 idxmax - ralvarez

12

它将给出前五个最常见的名称:

df['name'].value_counts().nlargest(5)

11
df['name'].value_counts()[:5].sort_values(ascending=False)

value_counts会返回一个pandas.core.series.Series的计数对象,sort_values(ascending=False)会将最高值放在前面。


1
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - xiawi
value_counts() 已经按降序返回了排序,因此调用 sort_values() 是不必要的。请参阅文档 - Matt VanEseltine

10

使用:

df['name'].mode()

或者
df['name'].value_counts().idxmax()

8
您可以使用此方法获取完美计数,它可以计算特定列的模式。
df['name'].value_counts()

7
这里有一个方法:
df['name'].value_counts()[df['name'].value_counts() == df['name'].value_counts().max()]

这会打印出:

helen    2
alex     2
Name: name, dtype: int64

5

只需使用以下代码,便可实现...

dataframe['name'].value_counts().nlargest(n)

频率最高和最低的功能是:

  • nlargest() 用于最常见的 'n' 个值
  • nsmallest() 用于最不常见的 'n' 个值

5

看似不明显,但速度飞快

f, u = pd.factorize(df.name.values)
counts = np.bincount(f)
u[counts == counts.max()]

array(['alex', 'helen'], dtype=object)

对于数字数据,这对我来说稍微慢了一点 :) 大约5%的差距。 - The Unfun Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接