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