以模式为聚合器分组[重复]

Posted

技术标签:

【中文标题】以模式为聚合器分组[重复]【英文标题】:group by with mode as aggregator [duplicate] 【发布时间】:2016-07-30 05:48:12 【问题描述】:

我有一组调查回复,我正在尝试使用 pandas 进行分析。我的目标是找到(对于这个例子)美国每个县最常见的性别,所以我使用以下代码:

import pandas as pd
from scipy import stats
file['sex'].groupby(file['county']).agg([('modeSex', stats.mode)])

输出是:

我怎样才能解压这个只得到模式值,而不是第二个值,告诉模式发生的频率?

这是数据框的示例:

county|sex
----------
079   | 1
----------
079   | 2
----------
079   | 2
----------
075   | 1
----------
075   | 1
----------
075   | 1
----------
075   | 2

期望的输出是:

county|modeSex
----------
079   | 2
----------
075   | 1

【问题讨论】:

【参考方案1】:

当您使用 stats.mode(x)[0] 时,Pandas 抱怨返回数组(我猜 pandas cell 不能保存 numpy 数组),因此您可以将其转换为列表或一个元组:

df = pd.DataFrame("C1": np.random.randint(10, size=100), "C2": np.random.choice(["X", "Y", "Z"], size=100))
print(df.groupby(['C2']).agg(lambda x: tuple(stats.mode(x)[0])))

输出:

     C1
C2      
X   (0,)
Y   (4,)
Z   (3,)

由于可以有多种模式,如果您想保留所有模式,则需要元组或列表。如果你想要第一种模式,你可以提取它:

df.groupby(['C2']).agg(lambda x: stats.mode(x)[0][0])

Out:

    C1
C2    
X    0
Y    4
Z    3

【讨论】:

file['sex'].groupby(file['county']).agg('modeSex': lambda x: stats.mode(x)[0][0]) 最终成为赢家...谢谢!【参考方案2】:

scipy.stats.mode 返回array of modal values, array of counts for each mode 所以我们可以使用stats.mode(a)[0] 只返回第一个值

这里是代码

import pandas as pd
from scipy import stats
# sample data frame
df2 = pd.DataFrame('X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4])
# use lambda functions
print df2.groupby(['X']).agg('Y': lambda x:stats.mode(x)[0])

输出:

    y   
X   
A  3
B  1

【讨论】:

在概念上有意义,但出现此错误:异常:必须产生聚合值 你能把代码和示例数据框一起发布 以及根据您的示例数据集代码在我这边运行良好 可能是版本问题。我在使用 pandas 0.18.0 时遇到同样的错误。 是的,我可能正在运行 python 2.7.11 和 pandas 0.17

以上是关于以模式为聚合器分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在mongodb聚合管道中将毫秒转换为日期以进行分组?

Python分组

MongoDB在每日分组中聚合[重复]

按数据框访问分组中的聚合值[重复]

Mysql按聚合排序和限制分组[重复]

将不在聚合函数中的列保留在分组语句中[重复]