Python 添加条件计数器:基于其他列的值的计数器列

Python 添加条件计数器:基于其他列的值的计数器列,python,pandas,Python,Pandas,我有一张这样的桌子 id id2 val a red apple a red orange b blue fish c violet beef a yellow banana a black pork id id2 val counter a red apple 1 a red orange 1 b blue

我有一张这样的桌子

id    id2      val
a     red      apple
a     red      orange
b     blue     fish
c     violet   beef
a     yellow   banana
a     black    pork
id    id2      val      counter
a     red      apple    1
a     red      orange   1
b     blue     fish     1
c     violet   beef     1
a     yellow   banana   2
a     black    pork     3
我想根据id和id2的值创建一个计数器

例如,id是客户id,id2是订单id,val是订单中的项目名称。我想为客户id和订单id创建一个计数器。这就是为什么前两行应该有相同的计数器1

我试过cumcount但他们会给我这样的东西

id    id2      val      counter
a     red      apple    1
a     red      orange   2
b     blue     fish     1
c     violet   beef     1
a     yellow   banana   1
a     black    pork     1
我试过了

df['counter']=df.groupby(['id','id2']).cumcount()+1

但这不是我想要的

我想要一个这样的结果表

id    id2      val
a     red      apple
a     red      orange
b     blue     fish
c     violet   beef
a     yellow   banana
a     black    pork
id    id2      val      counter
a     red      apple    1
a     red      orange   1
b     blue     fish     1
c     violet   beef     1
a     yellow   banana   2
a     black    pork     3

谢谢,

看起来您正在尝试计算对的唯一值
(id,id2)

您可以使用和:


我没有遵循预期的输出。为什么
黄香蕉
应该是2,而
紫牛肉
只有1?对于
id2
@roganjosh的每个唯一值,它是
id
中的一个计数器。我只是补充了一些信息。例如id是客户id,id2是订单id,val是订单中的项目id。就像亚马逊订单上的一个篮子。我想为每个客户创建一个计数器数量的订单。嗨,安,这正是我需要的。非常感谢!你能解释一下pd.factorize(x)[0]是如何工作的吗。谢谢,这是一个分类标签编码器。。。它将每个唯一类别编码为一个整数,从
0
开始,因此在第一个
id
“a”中,类别“红色”将编码为
0
,类别“黄色”将编码为
1
,依此类推。因此需要使用
.add(1)
获得所需的输出。由于我们在
groupby
中使用它,每个
id
中观察到的第一个类别将被编码为
0