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