2017-07-07 13 views
0

に他の行を取得:パンダは、次のデータフレームを考えるグループ

import pandas as pd 
import numpy as np 
d=pd.DataFrame({' ID':[1,1,1,1,2,2,2,2], 
       'Benefit':['M','M','M','M','M','M','M','M'], 
       'CED':[1,2,3,4,1,2,3,4], 
       'CTD':[np.nan,np.nan,7,8,np.nan,np.nan,np.nan,np.nan], 
       'CED_Rank':[4,3,2,1,4,3,2,1], 
       'CED_Max':[4,4,4,4,4,4,4,4]}) 
d 
    ID Benefit  CED  CED_Max  CED_Rank CTD 
0 1   M  1   4   4  NaN 
1 1   M  2   4   3  NaN 
2 1   M  3   4   2  7 
3 1   M  4   4   1  8 
4 2   M  1   4   4  NaN 
5 2   M  2   4   3  NaN 
6 2   M  3   4   2  NaN 
7 2   M  4   4   1  NaN 

CED_Maxは、IDと利益のためにグループごとの最大CED値です。

CED_Rankは、IDとBenefitのグループごとのCED値の順位です。

I「がCTD」列にNaN値を更新するために、以下の条件を使用したい: 列内の指定されたIDおよび利点は、グループ化:

  1. CTDがnullで、

  2. 場合
  3. CEDが、その後... CED_Max

に等しくない:

CTDは、次に高いCED_Rank値(最高ランク= 1)を持つ行のCEDと等しくなければなりません。事前に

ID Benefit  CED  CED_Max  CED_Rank CTD 
0 1   M  1   4   4  2 
1 1   M  2   4   3  3 
2 1   M  3   4   2  7 
3 1   M  4   4   1  8 
4 2   M  1   4   4  2 
5 2   M  2   4   3  3 
6 2   M  3   4   2  4 
7 2   M  4   4   1  NaN 

ありがとう:ここ

は、所望の結果です!

+1

「CEDがCED_Maxと等しくない」、あなたはオーバーshift' '後にそれを書くことができ、この部分のためにも、' shift' – Wen

+1

を使用してみてください – Wen

答えて

1

これを試してください。

d['CTD']=d.groupby('ID')['CTD'].fillna(d.CED.shift(-1)) 
# for The CED is not equal to CED_Max 
# d.CTD[d.CED==(d.CED_Max)&d.CTD.isnull()]=np.nan or d['CTD']=np.where(d.CED==(d.CED_Max)&d.CTD.isnull(), np.nan, d.CTD) 

Out[42]: 
    Benefit CED CED_Max CED_Rank CTD ID 
0  M 1  4   4 2.0 1 
1  M 2  4   3 3.0 1 
2  M 3  4   2 7.0 1 
3  M 4  4   1 8.0 1 
4  M 1  4   4 2.0 2 
5  M 2  4   3 3.0 2 
6  M 3  4   2 4.0 2 
7  M 4  4   1 NaN 2 
関連する問題