我有一个这样的数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame({'year': [1990,1990,1992,1992,1992],
'value': [100,200,300,400,np.nan],
'rank': [2,1,2,1,3]})
print(df)
year value rank
0 1990 100.0 2
1 1990 200.0 1
2 1992 300.0 2
3 1992 400.0 1
4 1992 NaN 3
我正在努力实现这一目标:
# For year 1990, maximum value is 200, rank is 1 and also relative value is 1.
year value rank value_relative
0 1990 100.0 2 0.5
1 1990 200.0 1 1
2 1992 300.0 2 0.75
3 1992 400.0 1 1
4 1992 NaN 3 NaN
我的尝试
df['value_relative'] = df.groupby('year')['value'].transform(lambda x: x/x[x.rank == 1]['value'])
如何计算每年的相对价值?
答案 0 :(得分:2)
IIUC在transform
之后使用first
和sort_values
df['value_relative']=df.value/df.sort_values('rank').groupby('year').value.transform('first')
df
Out[60]:
year value rank value_relative
0 1990 100.0 2 0.50
1 1990 200.0 1 1.00
2 1992 300.0 2 0.75
3 1992 400.0 1 1.00
4 1992 NaN 3 NaN
或者只是transform
max
df['value_relative']=df.value/df.groupby('year').value.transform('max')
另一种方法
df.value/df.loc[df.groupby('year')['rank'].transform('idxmin'),'value'].values
Out[64]:
0 0.50
1 1.00
2 0.75
3 1.00
4 NaN
Name: value, dtype: float64
如果您需要分母排名第二
df.value/df.year.map(df.loc[df['rank']==2].set_index('year')['value'])
此处的不同之处取决于您如何获得排名,如果基于value的max,则它们都应返回相同的结果,但是如果给定的排名与value列无关,那么您应该使用first
答案 1 :(得分:1)
我喜欢并接受了温家宝的回答,但想给我2美分:
最简单的方法是将值除以最大值,但是我正在尝试使用称为rank的单独列来学习执行此操作:
df.groupby('year')['value'].transform(lambda x: x/x.max())
0 0.50
1 1.00
2 0.75
3 1.00
4 NaN
排名== 2的另一种简单方法:
df.groupby('year')['value'].transform(lambda x: x/x.nlargest(2).iloc[-1])
0 1.000000
1 2.000000
2 1.000000
3 1.333333
4 NaN
注意:温的方法:
df.value/df.year.map(df.loc[df['rank']==2].set_index('year')['value'])
0 1.000000
1 2.000000
2 1.000000
3 1.333333
4 NaN