【问题标题】:groupby lambda function taking 2 column argumentsgroupby lambda 函数采用 2 列参数
【发布时间】:2021-02-22 19:07:45
【问题描述】:

我有一个熊猫数据框:

pd.DataFrame({
'building': ['house', 'tower', 'house', 'apt', 'apt'],
'material': ['wood', 'metal', 'brick', 'metal', 'metal'],
'size': [20, 100, 35, 5, 15]})

我正在寻找编写一个 groupby、lambda 函数,看起来像这样:

groupby('building').agg(
proportion_of_blue_area=('size', lambda x: sum(x) if x == 'metal' / sum(x))).reset_index()

我正在寻找的预期输出是金属尺寸占建筑物总尺寸的百分比。我知道 lambda 函数实际上并没有调用“材料”列,我不确定在哪里/如何包含它。 我需要在 groupby.agg 中以它显示的方式解决这个问题。谢谢。

【问题讨论】:

  • 这与您上一个问题有何不同?
  • 我正在为 lambda 函数计算两列和参数,而不仅仅是 1。
  • groupby().agg() 不会将信息从一列带到另一列。也许你想要groupby().apply()

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


【解决方案1】:

我认为pd.transform 是您缺少的那个:


(
    pd.DataFrame({
        'building': ['house', 'tower', 'house', 'apt', 'apt'],
        'material': ['wood', 'metal', 'brick', 'metal', 'metal'],
        'size': [20, 100, 35, 5, 15]
    })
    .groupby(["building", "material"], as_index=False)
    .agg("sum")
    .assign(size=lambda df: df.groupby("building").transform(lambda x: x / x.sum()))
    .loc[lambda df: df.material == "metal"]
)

#   building material  size
# 0      apt    metal   1.0
# 3    tower    metal   1.0

注意:我添加了第一个 groupby-sum,因为我注意到两个 apt/metal 组合,并猜测它是要相加的。它是可选的。

【讨论】:

  • 谢谢@ClementWalter
猜你喜欢
  • 2020-11-20
  • 2021-03-18
  • 2018-05-13
  • 1970-01-01
  • 2019-10-22
  • 2019-04-04
  • 2021-05-17
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多