2015-11-13 1 views
1

У меня есть кадр данных, как показано нижеСоздание нового столбца в панде dataframe с использованием логической индексации и группы по

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 

Я хочу, чтобы этот ранг был новым столбцом в dataframe 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 вернуть серию с индексом выровненной к вашему ориг ДФ:

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

Большое спасибо, работает отлично. Не могу вас поблагодарить. –