python-在 pandas 中,如何为组中的第n个观察值创建一个n的变量?

考虑这个

df = pd.DataFrame({'B': ['a', 'a', 'b', 'b'], 'C': [1, 2, 6,2]})

df
Out[128]: 
   B  C
0  a  1
1  a  2
2  b  6
3  b  2

我想创建一个变量,该变量只与每个groupby(‘B’)组中的’C’排序后的观察顺序相对应.

df.sort_values(['B','C'])
Out[129]: 
   B  C  order
0  a  1  1
1  a  2  2
3  b  2  1
2  b  6  2

我怎样才能做到这一点?我正在考虑创建一列,并使用cumsum,但这似乎太笨拙了…

最佳答案

我认为您可以将len(df)与range一起使用:

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 
                   'B': ['a', 'a', 'b'], 
                   'C': [5, 3, 2]})
print df
   A  B  C
0  1  a  5
1  2  a  3
2  3  b  2

df.sort_values(by='C', inplace=True)
#or without inplace
#df = df.sort_values(by='C')
print df
   A  B  C
2  3  b  2
1  2  a  3
0  1  a  5

df['order'] = range(1,len(df)+1) 
print df
   A  B  C  order
2  3  b  2      1
1  2  a  3      2
0  1  a  5      3

通过评论编辑:

我认为您可以将groupbycumcount结合使用:

import pandas as pd

df = pd.DataFrame({'B': ['a', 'a', 'b', 'b'], 'C': [1, 2, 6,2]})

df.sort_values(['B','C'], inplace=True)
#or without inplace
#df = df.sort_values(['B','C'])

print df
   B  C
0  a  1
1  a  2
3  b  2
2  b  6

df['order'] = df.groupby('B', sort=False).cumcount() + 1
print df
   B  C  order
0  a  1      1
1  a  2      2
3  b  2      1
2  b  6      2