【问题标题】:Python - Groupby & apply row sum functionPython - Groupby 并应用行求和函数
【发布时间】:2022-01-04 17:00:17
【问题描述】:

我有一个数据框 df

 ID A
 1  2
 1  3
 1  4
 2  1
 2  2

我想遍历每个 ID 组并将行值除以其组总和,所以最后我得到以下输出列 B

 ID A  B
 1  2  2/9
 1  3  3/9
 1  4  4/9
 2  1  1/3
 2  2  2/3

我尝试使用 apply 命令编写自己的函数,但总是出错

def row_sum(input):
    sum=input/input.sum()
    return sum

df.groupby("ID").apply(row_sum: input=df["A"])

有什么想法吗?我可以把它写成一个类和方法吗?

【问题讨论】:

  • 您遇到的具体错误是什么?
  • 还有,最后一行语法错误

标签: python apply


【解决方案1】:

当您应用分组依据时,您会得到一个 pandas.core.groupby.GroupBy 类型的对象。此类的 apply 方法接收一个函数,该函数接收 一个数据帧作为其输入。

您可以尝试以下方法:

def ratio_by_group(df):
    return df['A']/df['A'].sum()

df.groupby("ID").apply(ratio_by_group)

我还建议阅读 pandas.core.groupby.GroupBy.apply 上的 pandas 文档页面:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.apply.html

【讨论】:

  • OP 想要添加列“B”:df['B'] = df.groupby("ID",group_keys=False).apply(ratio_by_group)
【解决方案2】:

您可以尝试按ID 分组并转换分组的sum 并将每一行除以它。整个结果可以assigned 到一个名为B 的新列中。

import pandas as pd

df = pd.DataFrame({"ID": [1, 1, 1, 2, 2], "A": [2, 3, 4, 1, 2]})
df.assign(B=df["A"] / df.groupby("ID")["A"].transform("sum"))

给了

   ID  A         B
0   1  2  0.222222
1   1  3  0.333333
2   1  4  0.444444
3   2  1  0.333333
4   2  2  0.666667

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2023-03-24
    • 2018-07-23
    • 2021-02-17
    • 1970-01-01
    • 2021-09-05
    • 2022-01-14
    • 2019-02-16
    • 2021-05-30
    相关资源
    最近更新 更多