Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python&;熊猫:获得平均等级_Python_Pandas - Fatal编程技术网

python&;熊猫:获得平均等级

python&;熊猫:获得平均等级,python,pandas,Python,Pandas,我有一个数据框 ID 2014-01-01 2015-01-01 2016-01-01 1 NaN 0.1 0.2 2 0.1 0.3 0.5 3 0.2 NaN 0.7 4 0.8 0.4 0.1 对于每个日期(col),

我有一个数据框

ID    2014-01-01    2015-01-01     2016-01-01
1     NaN           0.1            0.2                           
2     0.1           0.3            0.5
3     0.2           NaN            0.7
4     0.8           0.4            0.1
对于每个日期(col),我想获得每个id的排名。例如,在col'2014-01-01'中,id=4的值最大,因此我们将排名1分配给id=4。id=3有第二大值,所以我们给它排名2。如果数据为NaN,则忽略它

ID    2014-01-01    2015-01-01     2016-01-01
1     NaN           3              3                           
2     3             2              2
3     2             NaN            1
4     1             1              4
下一步是获得每个id的平均秩。例如,id1的AvgRank=(4+3)/2=3.5,id2的AvgRank=(3+2+2)/3=2.33

我的算法是:

为每个id创建一个字典({str:list})->遍历所有列->为每个列计算排名并更新到字典中的列表

但我认为这对于这个简单的问题来说太复杂了。 有没有什么简单的方法可以得到avgrank表

下面是创建数据帧的代码

df = pd.DataFrame({'ID':[1,2,3,4],'2014-01-01':[float('NaN'),0.1,0.2,0.8],
'2015-01-01':[0.1,0.3,float('NaN'),0.4],'2016-01-01':[0.2,0.5,0.7,0.1]})

不清楚为什么您认为第二列中第一行的值应该是
4
,但下面给出了您想要的。在这里,我们在感兴趣的列上调用
rank
,并传递
method='densite'
ascending=False
,以便正确地排列:

In [60]:
df.ix[:, :-1].rank(method='dense', ascending=False)

Out[60]:
   2014-01-01  2015-01-01  2016-01-01
0         NaN           3           3
1           3           2           2
2           2         NaN           1
3           1           1           4
然后,我们将原始df中的单列和轴=1的结果作为行平均值:

In [67]:
pd.concat([df['ID'], df.ix[:, :-1].rank(method='dense', ascending=False).mean(axis=1)], axis=1).rename(columns={0:'AvgRank'})

Out[67]:
   ID   AvgRank
0   1  3.000000
1   2  2.333333
2   3  1.500000
3   4  2.000000

为什么在
2015-01-01
中值
0.1
的排名是
4
?感谢您指出这一点。我编辑了这个问题。
In [67]:
pd.concat([df['ID'], df.ix[:, :-1].rank(method='dense', ascending=False).mean(axis=1)], axis=1).rename(columns={0:'AvgRank'})

Out[67]:
   ID   AvgRank
0   1  3.000000
1   2  2.333333
2   3  1.500000
3   4  2.000000