group by with mode as aggregator

时间:2016-04-08 20:09:27

标签: python python-3.x pandas scipy

我有一组调查回复,我试图用熊猫分析。我的目标是找到(对于此示例)美国每个县中最常见的性别,因此我使用以下代码:

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

输出结果为:

enter image description here

如何将此解压缩为仅获取模式值而不是第二个值来说明模式发生的频率?

以下是数据框的示例:

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

所需的输出是:

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

2 个答案:

答案 0 :(得分:2)

当你使用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

答案 1 :(得分:1)

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