如何从大熊猫数据框中的每一行的n
单元中找到最佳N
的平均值?
请参阅下面的数据框,我要在其中找到6个最佳4分的平均值(n = 4,N = 6):
df = pd.DataFrame({'stu1' : [17,19,12,17,13,13],
'stu2' : [20,18,15,17,15,0],
'stu3' : [16,19,0,16,0,0],
'stu4' : [0,0,0,0,0,0],
'stu5' : [0,8,14,0,7,9]},
index = 'q1 q2 q3 q4 q5 q6'.split()).T
st1
的最佳4的平均值将基于以下值:17、19、17、13并为16.50。对于st3
,则基于16、19、0、16,得出12.75。
如何为所有行计算这个?
答案 0 :(得分:3)
df.stack().sort_values().groupby(level=0).tail(4).mean(level=0)
stu4 0.00
stu3 12.75
stu5 9.50
stu1 16.50
stu2 17.50
dtype: float64
答案 1 :(得分:3)
您可以按行对列进行排序,然后仅需切片即可获得最好的4列。从那里开始,计算均值很简单:
np.sort(df)[:,-4:].mean(axis=1)
# array([16.5 , 17.5 , 12.75, 0. , 9.5 ])
pd.Series(np.sort(df)[:,-4:].mean(axis=1), index=df.index)
stu1 16.50
stu2 17.50
stu3 12.75
stu4 0.00
stu5 9.50
dtype: float64
答案 2 :(得分:2)
只需使用np.partition
添加选项。如果您的数据很大,那么np.partition
比np.sort
更好。
np.partition(df, len(df)-4)[:,-4:].mean(-1)
Out[1230]: array([16.5 , 17.5 , 12.75, 0. , 9.5 ])
答案 3 :(得分:2)
以您的情况rank
df[df.rank(1,method='first',ascending=False)<=4].mean(1)
stu1 16.50
stu2 17.50
stu3 12.75
stu4 0.00
stu5 9.50
dtype: float64