pandas根据分组

时间:2018-02-22 20:05:29

标签: 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']})

enter image description here

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

order = [1,2,3,3,4, 1,2]
d['order'] = order
d

col2大部分都是唯一的,如果有任何重复order列应该重复订单号。

enter image description here

我使用groupbyrank无济于事。通常,提供method='first'rank方法应该可以解决问题,但会出错。

注意:对于col1中与每个组对应的不同条目数,df会大得多。所以请提供一个普遍的答案。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

使用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