Python - Groupby 并应用行求和函数

Python - Groupby & apply row sum function

我得到了一个数据框 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

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

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

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

有什么想法吗?我可以将其写入 class & 方法吗?

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

您可以尝试以下方法:

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

您可以尝试按 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