给定一个时间序列DataFrame
,是否可以创建一个具有相同尺寸的新DataFrame
,但值是与其他列相比的每一行的排名(排在最前面的最小值)?>
示例:
ABC DEFG HIJK XYZ
date
2018-01-14 0.110541 0.007615 0.063217 0.002543
2018-01-21 0.007012 0.042854 0.061271 0.007988
2018-01-28 0.085946 0.177466 0.046432 0.069297
2018-02-04 0.018278 0.065254 0.038972 0.027278
2018-02-11 0.071785 0.033603 0.075826 0.073270
第一行将变为:
ABC DEFG HIJK XYZ
date
2018-01-14 4 2 3 1
XYZ
在该行中的值最小,而ABC
在该行中的值最大。
numpy.argsort
看起来像可能帮助,但是由于它会输出位置本身,因此我无法使其正常工作。
非常感谢
答案 0 :(得分:3)
对每行rank使用双argsort
,并传递给DataFrame
构造函数:
df1 = pd.DataFrame(df.values.argsort().argsort() + 1, index=df.index, columns=df.columns)
print (df1)
ABC DEFG HIJK XYZ
date
2018-01-14 4 2 3 1
2018-01-21 1 3 4 2
2018-01-28 3 4 1 2
2018-02-04 1 4 3 2
2018-02-11 2 1 4 3
或将DataFrame.rank
与method ='dense'一起使用:
df1 = df.rank(axis=1, method='dense').astype(int)
print (df1)
ABC DEFG HIJK XYZ
date
2018-01-14 4 2 3 1
2018-01-21 1 3 4 2
2018-01-28 3 4 1 2
2018-02-04 1 4 3 2
2018-02-11 2 1 4 3