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 分组的一行中:
如果 CTD 为空并且
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
给定以下 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 分组的一行中:
如果 CTD 为空并且
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