3 回答
TA贡献1809条经验 获得超8个赞
我会用Series.div. 使用和n.e.为每个组创建一个具有相应值的系列。Series.whereGroupby.transform
请注意first,省略NaN值,因此.ne.值在组中的位置无关紧要。我们也可以max使用first.
df['Rel']=df['G'].div(df['G'].where(df['E'].eq('n.e.'))
.groupby(df['#F']).transform('first'))
print(df)
#F E G Rel
0 1 n.e. 153 1.000000
1 1 60 15 0.098039
2 1 99 10 0.065359
3 1 S 23 0.150327
4 2 n.e. 190 1.000000
5 2 60 44 0.231579
6 2 99 22 0.115789
7 2 S 67 0.352632
编辑
df['Rel']=df['G'].div(df['G'].where(df['E'].eq('n.e. '))
.groupby(df['#F']).transform('first'))
TA贡献1886条经验 获得超2个赞
IIUCtransform
df['Rel']=df.G/df.groupby(['name','#F']).G.transform('max')
df
name #F E G Rel
0 T.w. 1 n.e. 153 1.000000
1 T.w. 1 60 15 0.098039
2 T.w. 1 99 10 0.065359
3 T.w. 1 S 23 0.150327
4 T.w. 2 n.e. 190 1.000000
5 T.w. 2 60 44 0.231579
6 T.w. 2 99 22 0.115789
7 T.w. 2 S 67 0.352632
方法二
s=df.loc[df.E.eq('n.e.')].set_index(['name', '#F']).G.reindex(pd.MultiIndex.from_frame(df[['name', '#F']])).values
df['Rel']=df.G/s
或者
df['Rel']=df.G/df.G.mul(df.E.eq('n.e.')).groupby([df['name'],df['#F']]).transform('max')
df
name #F E G Rel
0 T.w. 1 n.e. 153 1.000000
1 T.w. 1 60 15 0.098039
2 T.w. 1 99 10 0.065359
3 T.w. 1 S 23 0.150327
4 T.w. 2 n.e. 190 1.000000
5 T.w. 2 60 44 0.231579
6 T.w. 2 99 22 0.115789
7 T.w. 2 S 67 0.352632
TA贡献1804条经验 获得超2个赞
df.loc[df['E'] == 'n.e.', 'G_ne'] = df['G']
df['G_ne'] = df['G_ne'].fillna(method='ffill')
df['rel'] = df['G'] / df['G_ne']
print(df)
输出:
#F E G G_ne rel
0 1 n.e. 153 153.0 1.000000
1 1 60 15 153.0 0.098039
2 1 99 10 153.0 0.065359
3 1 S 23 153.0 0.150327
4 2 n.e. 190 190.0 1.000000
5 2 60 44 190.0 0.231579
6 2 99 22 190.0 0.115789
7 2 S 67 190.0 0.352632
添加回答
举报