在多个 pandas 列上使用 groupby 后计算值的出现次数

Counting occurrence of values after using groupby on multiple pandas columns

我的输入数据框如下:

使用以下代码行生成

 l = [["a", 12, 12], ["a", 12, 33.], ["b", 12.3, 12.3], ["a", 13, 1]]
df = pd.DataFrame(l, columns=["a", "b", "c"])

我目前可以累计频率如下

使用

df['freq'] = df.groupby(by=["a","b"]).cumcount()+1

它考虑了 a 列和 b 列中的公共值并计算它们。但是,我只想在 b 列值不同而 a 列值相同时才添加到频率计数中。下图显示了所需输出的形式:

如何在 pandas 中以优化方式实现此目的?

您可以使用双 .groupby。例如:

df["freq"] = df.groupby("a")["b"].apply(lambda x: x.groupby(x).ngroup() + 1)
print(df)

打印:

   a     b     c  freq
0  a  12.0  12.0     1
1  a  12.0  33.0     1
2  b  12.3  12.3     1
3  a  13.0   1.0     2

IIUC,尝试:

df['freq'] = df.groupby('a')['b'].transform(lambda x: x.factorize()[0] + 1)

输出:

   a     b     c  freq
0  a  12.0  12.0     1
1  a  12.0  33.0     1
2  b  12.3  12.3     1
3  a  13.0   1.0     2

pd.Series.factorize 将为每个 'b' 的唯一值创建一个整数,并用零表示。