使用逻辑索引和分组依据在熊猫数据框中创建新列

Creating a new column in panda dataframe using logical indexing and group by

我有一个如下所示的数据框

df=pd.DataFrame({'a':['a','a','b','a','b','a','a','a'], 'b' :        [1,0,0,1,0,1,1,1], 'c' : [1,2,3,4,5,6,7,8],'d':['1','2','1','2','1','2','1','2']})
df
Out[94]:
a   b   c   d
0   a   1   1   1
1   a   0   2   2
2   b   0   3   1
3   a   1   4   2
4   b   0   5   1
5   a   1   6   2
6   a   1   7   1
7   a   1   8   2

我想要下面这样的东西

df[(df['a']=='a') & (df['b']==1)]

在[97]中:

df[(df['a']=='a') & (df['b']==1)].groupby('d')['c'].rank()
df[(df['a']=='a') & (df['b']==1)].groupby('d')['c'].rank()
Out[97]:
0    1
3    1
5    2
6    2
7    3
dtype: float64

我希望这个排名作为数据框 df 中的一个新列,并且在没有排名的任何地方我都想要 NaN。所以最终输出将如下所示

    a   b   c   d  rank
0   a   1   1   1  1
1   a   0   2   2  NaN
2   b   0   3   1  NaN
3   a   1   4   2  1
4   b   0   5   1  NaN
5   a   1   6   2  2
6   a   1   7   1  2
7   a   1   8   2  3

我将感谢所有的帮助和指导。非常感谢。

差不多了,你只需要调用 transform 到 return 一个索引与你的原始 df 对齐的系列:

In [459]:
df['rank'] = df[(df['a']=='a') & (df['b']==1)].groupby('d')['c'].transform(pd.Series.rank)
df

Out[459]:
   a  b  c  d  rank
0  a  1  1  1     1
1  a  0  2  2   NaN
2  b  0  3  1   NaN
3  a  1  4  2     1
4  b  0  5  1   NaN
5  a  1  6  2     2
6  a  1  7  1     2
7  a  1  8  2     3