计算每行平均“ 4个最佳”

时间:2019-06-20 23:12:01

标签: python pandas dataframe

如何从大熊猫数据框中的每一行的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。

如何为所有行计算这个?

4 个答案:

答案 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.partitionnp.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