在多个 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' 的唯一值创建一个整数,并用零表示。
我的输入数据框如下:
使用以下代码行生成
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' 的唯一值创建一个整数,并用零表示。