Python 3.x 每当另一列更改时求和

Python 3.x 每当另一列更改时求和,python-3.x,pandas,Python 3.x,Pandas,我有一个带有供应商、发票和金额的df。我想创建一个名为ITEM的列,它从1开始,当发票号更改时,它将更改为2,依此类推 我试过使用cumsum,但它实际上不起作用——不起作用也是有道理的。按照我编写代码的方式,对于同一张发票,它将求和1,并在发票更改时重新开始 data = pd.read_csv('data.csv') data['ITEM_drop'] = 1 s = data['INVOICE'].ne(data['INVOICE'].shift()).cumsum() data['IT

我有一个带有供应商、发票和金额的
df
。我想创建一个名为ITEM的列,它从1开始,当发票号更改时,它将更改为2,依此类推

我试过使用cumsum,但它实际上不起作用——不起作用也是有道理的。按照我编写代码的方式,对于同一张发票,它将求和1,并在发票更改时重新开始

data = pd.read_csv('data.csv')

data['ITEM_drop'] = 1
s = data['INVOICE'].ne(data['INVOICE'].shift()).cumsum()
data['ITEM'] = data.groupby(s)['ITEM_drop'].cumsum()
输出:

VENDOR   INVOICE   AMOUNT   ITEM_drop   ITEM
  A        123       10       1           1
  A        123       12       1           2
  A        456       44       1           1
  A        456       5        1           2
  A        456       10       1           3
  B        999       7        1           1 
  B        999       1        1           2

我想要的是:

VENDOR   INVOICE   AMOUNT   ITEM_drop   ITEM
  A        123       10       1           1
  A        123       12       1           1
  A        456       44       1           2
  A        456       5        1           2
  A        456       10       1           2
  B        999       7        1           3 
  B        999       1        1           3


你已经有了。这是
s
data['ITEM']=s
谢谢。我以前没注意到!到目前为止,您的发票列似乎已排序。因此,您可以执行:
df.assign(ITEM=df.INVOICE.astype('category').cat.codes+1)