【问题标题】:Using lambda functions in groupby.agg, pandas在 groupby.agg、pandas 中使用 lambda 函数
【发布时间】:2021-02-22 17:21:46
【问题描述】:

我有一个这样的数据框:

pd.DataFrame({
'animal': ['dog', 'dog', 'cat', 'dog', 'cat'],
'color': ['brown', 'black', 'white', 'black', 'black']})

我正在尝试编写这样的 groupby 函数:

groupby('animal').agg(
proportion_of_black=('color', lambda x: 1 if x == 'black' else 0)).reset_index()

它返回以下错误消息:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我的代码哪里出错了?

【问题讨论】:

    标签: python-3.x pandas lambda pandas-groupby


    【解决方案1】:

    由于您的问题要求的是比例而不是计数,您应该这样做:

    df.groupby(['animal']).agg(
       proportion=('color', lambda x: x.eq('black').mean())).reset_index()
    
        animal  proportion
    0   cat     0.500000
    1   dog     0.666667
    

    【讨论】:

    • @MichaelSzczesny 没有数字数据,也不是平均值。
    • @MichaelSzczesny Henry 是正确的。 mean 是逻辑值的比例
    • @MichaelSzczesny 也亨利的解决方案在这种情况下是最好的。
    • @MichaelSzczesny 是的。因为 mean 是 sum/count 的简写形式
    • 我想我们对“一个函数调用”的含义有不同的解释:)
    【解决方案2】:

    我的代码哪里出错了?当你这样做时:

    df.groupby('animal').agg(
    proportion_of_black=('color', lambda x: 1 if x == 'black' else 0))
    

    x 是每个动物的系列color,例如df.loc[df['animal']=='dog', 'color']。所以x=='black' 是一系列布尔值。但是 Python 中的 if 只接受一个布尔值。而且 Pandas 不知道如何将系列 x==black 转换为单个布尔值以传递给 if x=='black,并且它会如您所见地抱怨。

    如何修复您的代码:应避免使用 apply,即使在 groupby() 之后也是如此。在您的情况下,您可以使用mean() 获得黑色的比例:

    df['color'].eq('black').groupby(df['animal']).mean()
    

    输出:

    animal
    cat    0.500000
    dog    0.666667
    Name: color, dtype: float64
    

    【讨论】:

      【解决方案3】:

      使用any 修复您的代码

      df.groupby('animal').agg(
      proportion_of_black=('color', lambda x: 1 if any(x == 'black') else 0)).reset_index()
      

      如果需要黑色计数

      df.groupby('animal').agg(
      proportion_of_black=('color', lambda x: sum(x == 'black') )).reset_index()
      Out[124]: 
        animal  proportion_of_black
      0    cat                    1
      1    dog                    2
      

      更新 2

      pd.crosstab(df.animal,df.color,normalize='index') # ['black']
      Out[128]: 
      color      black     brown  white
      animal                           
      cat     0.500000  0.000000    0.5
      dog     0.666667  0.333333    0.0
      

      【讨论】:

      • 我正在寻找汇总“黑色”的计数。不指定它们是否是黑色的。
      • 非常感谢@BEN_YO!现在,如果我想要每只动物中的黑色百分比怎么办?那么黑色的狗是 0.66,黑色的猫是 0.5?
      • @MichaelMathewsJr。再次检查更新,另外,请一次性发布您的所有问题,否则您将来会收到一些反对意见
      • 好吧,对不起,以后不会这样做了
      • 这是解决此类问题的最佳方法
      猜你喜欢
      • 1970-01-01
      • 2022-10-04
      • 2020-01-30
      • 1970-01-01
      • 2018-07-28
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多