【问题标题】:Pandas use groupby to apply a different function for each value of the groupby variablePandas 使用 groupby 为 groupby 变量的每个值应用不同的函数
【发布时间】:2014-12-05 15:31:29
【问题描述】:

我想使用 groupby,但我不想将相同的函数应用于每个组,而是指定将哪个函数应用于哪个组值。我在这里提供了一个非常简单的示例来说明这一点,但实际上我的 groupby 变量有很多值,而且我的函数都是用户定义的并且相当复杂——因此涉及单独选择每个组或应用对所有组使用相同的功能是不切实际的。 (为这个非常相似的问题提供了此类答案:how to apply different functions to each group of pandas groupby?,但他们没有解决我的问题)

df = DataFrame({'Category': ['A','A','A','B','B','B','C','C','C'],
               'Total': [1, 2, 3, 1, 2, 3, 1, 2, 3]})

我希望能够为我的 groupby 变量的每个级别指定一个函数:

function_map = {'A': np.mean,
                'B': np.max,
                'C': np.min}

我想做的是这样的:

df.groupby('Category').apply(function_map)

我想要的结果形式看起来像这样的DataFrame:

result = DataFrame({'Category': ['A','B','C'],
               'Total': [2, 3, 1]})

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    只需使用 lambda,类似这样的东西

    df.groupby('Category').apply(lambda r: function_map[r.name](r.Total))
    

    另外,你应该使用numpy 函数,所以np.mean、np.max、np.min

    【讨论】:

    • 这是有道理的,但是如何指定 function_map 以使其包含有效 python 语法的函数?或者,或者,如果我将函数的名称存储为字符串,那么如何将它们作为函数传递给应用?
    • 我按照您的建议编辑了我的问题以使用 numpy 函数,这允许我为 function_map 创建一个有效的字典。当我现在尝试使用您的方法时,出现错误:TypeError: 'Series' objects are mutable, thus they cannot be hashed
    • 试试r.Category.iloc[0] 这样你就不会通过整个系列。
    • 现在可以了,谢谢!这似乎也有效:df.groupby('Category').Total.apply(lambda r: function_map[r.name](r))
    • 是的,r.name 更好!我会更新我的答案。
    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2018-12-20
    • 2015-05-14
    • 2022-01-22
    相关资源
    最近更新 更多