【问题标题】:Unable to use .size() .div() methods inside pandas groupby with lambda function无法在带有 lambda 函数的 pandas groupby 中使用 .size() .div() 方法
【发布时间】:2019-07-03 21:08:53
【问题描述】:

我正在使用以下代码行来计算条件概率

    variable = 'variable_name'
    probs = df.groupby(variable).size().div(len(df))
    cond_probs = df.groupby([variable, 'has_income']).size().div(len(df)).div(probs, axis=0, level=variable)

这些结果会产生以下输出:

    varibale_name         has_income
    (0.999, 2.0]          False          0.756323
                          True           0.243677
    (2.0, 3.0]            False          0.798372
                          True           0.201628
    (3.0, 16.0]           False          0.809635
                          True           0.190365

我想在输出中添加一个附加列作为每个组的样本大小,但我无法重写 lambda 函数内的公式,因为组对象没有与df.groupby() 返回的对象。 示例:

    cond_probs =df.groupby([variable, 'has_income']).apply(lambda x: 
    pd.Series({
        'probs': x.size().div(len(df)).div(probs, axis=0, level=variable),
        'size': x.size()
    }))

错误:TypeError:'numpy.int32' 对象不可调用

是否有任何替代方法可以以奇特的方式实现这些结果,而不需要计算两个 groupby 并在最后加入数据帧?

【问题讨论】:

  • 你试过x.size,不带括号吗?

标签: python pandas dataframe pandas-groupby


【解决方案1】:

当您将applygroupby 一起使用时,您不会获得组对象,而是对应于相关组的数据帧切片。所以 x 在你的情况下是一个 DataFrame,而不是 GroupBy 对象 - 对待它就像对待 df 一样。

cond_probs = df.groupby([variable, 'has_income']).apply(lambda x: 
  pd.Series({
    'probs': (len(x) / len(df)) / probs[x.iloc[0][variable]],
    'size': len(x)
  })
)

注意如果您在数据帧上使用 .size,它将返回单元格总数 - 所以它与 GroupBy.size 不同(docs

【讨论】:

  • 嗨鲁本谢谢你的回复,不幸的是 len(x) / len(df) 返回一个我不能调用方法的标量 .div(probs, axis=0, level=variable )
  • 我更新了除以概率的答案,您不需要在数据框中执行此操作,因为x 应该始终只是一个值
猜你喜欢
  • 2018-06-26
  • 2021-02-27
  • 2017-06-03
  • 2020-08-21
  • 2023-03-23
  • 2021-07-14
  • 1970-01-01
  • 2020-12-05
  • 2021-06-19
相关资源
最近更新 更多