Pandas 获取组中的其他行

Pandas Get Other Row in Group

给定以下 DataFrame:

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 和 Benefit 的最大 CED 值。

CED_Rank是ID和Benefit每组CED值排名

我想使用以下条件来更新 "CTD" 列中的 NaN 值: 在给定 ID 和 Benefit 分组的一行中:

  1. 如果 CTD 为空并且

  2. 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

提前致谢!

试试这个。

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