2015-11-13 79 views
1

我有像下面创建在熊猫数据帧的新列利用逻辑索引和组由

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。 SO最终输出将如下所示

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 

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

回答

1

快到了,你只需要调用transform与对齐到您的原稿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 
+0

非常感谢,可以完美运行。不够感谢你。 –