【问题标题】: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

【问题讨论】:

    标签: python python-3.x pandas scipy


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2015-04-03
    • 2013-04-03
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多