Pandas 根据分组添加订单列

Pandas 根据分组添加订单列,pandas,sorting,pandas-groupby,rank,Pandas,Sorting,Pandas Groupby,Rank,假设有一个包含两列的数据框,col1表示组 d = pd.DataFrame({'col1': ['a','a','a','a', 'a', 'b','b'], 'col2': ['nmh','ghb','dfe', 'dfe', 'kil', 'gtr','klm']}) 我想添加第三列,它使用col1中的组和col2中的条目,并添加线性顺序,如下所示: order = [1,2,3,3,4, 1,2] d['order'] = order d col2大部分是唯一的,如果有重复的订单列

假设有一个包含两列的数据框,
col1
表示组

d = pd.DataFrame({'col1': ['a','a','a','a', 'a', 'b','b'], 'col2': ['nmh','ghb','dfe', 'dfe', 'kil', 'gtr','klm']})

我想添加第三列,它使用
col1
中的组和
col2
中的条目,并添加线性顺序,如下所示:

order = [1,2,3,3,4, 1,2]
d['order'] = order
d
col2
大部分是唯一的,如果有重复的
订单
列应该重复订单号

我使用了
groupby
rank
,但没有用。通常向
rank
方法提供
method='first'
可以解决问题,但会给出一个错误

注意:df将更大,在
col1
中,每组对应的条目数不同。因此,请提供一个概括的答案

In [45]: d['order'] = (d.groupby('col1')['col2']
                        .transform(lambda x: (x!=x.shift()).cumsum()))

In [46]: d
Out[46]:
  col1 col2  order
0    a  nmh      1
1    a  ghb      2
2    a  dfe      3
3    a  dfe      3
4    a  kil      4
5    b  gtr      1
6    b  klm      2
或者是@Zero的更好替代品:

In [52]: d.col2.ne(d.col2.shift()).groupby(d.col1).cumsum()
Out[52]:
0    1.0
1    2.0
2    3.0
3    3.0
4    4.0
5    1.0
6    2.0
Name: col2, dtype: float64

使用
factorize

d['Order']=d.groupby('col1').col2.transform(lambda x : pd.factorize(x)[0]+1)
d
Out[1641]: 
  col1 col2  Order
0    a  nmh      1
1    a  ghb      2
2    a  dfe      3
3    a  dfe      3
4    a  kil      4
5    b  gtr      1
6    b  klm      2

或者
d.col2.ne(d.col2.shift()).groupby(d.col1.cumsum()
谢谢你的回答。虽然MaxU和Zero的回答都正确,但我会选择这个作为答案,因为它“看起来”更简单。尽管如此,我还是很惊讶这么简单的任务需要这么多的编码。@ilyas yw:-),是的。有时候,当有团队的时候,我们需要付出很多努力