排序pandas Timestamp对象

时间:2017-08-09 10:11:42

标签: python duplicates timestamp mergesort ranking

我正在对像这样的Pandas系列Timestamp对象进行排名(下面仅显示部分数据条目):

0     1993-03-25
1     1985-06-18
2     1971-07-08
3     1975-09-27
4     2000-02-06
5     1979-07-06
6     1978-05-18
7     1989-10-24
8     1989-10-24
9     1971-04-10
10    1985-05-11

我想按照时间顺序使用他们的原始索引使用排名方法(如

)对它们进行排名

.sort_values().index

并生成此表单的输出,其中原始系列索引在右侧,左侧有新索引:

0   9
1   6
2   1
3   2
4   10
5   4
6   3
7   8
8   7
9   0
10  5

但是,Timestamp对象有几个重复甚至三元组,例如原始系列中的第7行和第8行(它们都是'1989-10-24'),并且看起来sort_values()会随机给出无论其出现的顺序如何,它们都是一个等级(即,第7行出现在第8行之前,因此应该接收更高的等级顺序,第i行,然后是(第i + 1)行第8行和(i + 2) - 在下一个日历日期)。在重复的Timestamp对象相距很远的某些情况下,它们的排名可能相差很大。我也尝试过'mergesort'来解决这个问题。

有没有办法通过优先考虑系列中首先出现的那个来对排名时间戳对象进行排名?

新编辑:

澄清一下,我的意思是有一些重复的时间戳导致排名问题。例如,同一日期可能有两个重复的时间戳(例如,01/02/2017),而系列中首先出现的时间戳应该比后来出现的更低。 我发现我使用的排名方法随机分配给他们一个等级,而不管他们在系列中的出现顺序。以下面的例子为例:

0  01/02/2017
1  12/25/2016
2  03/22/2014
3  07/06/2011 
4  01/02/2017
5  01/03/2017

第0行和第4行是相同的日期,所以如果我对这个系列进行排名,那么理想的输出将是

0  3
1  2
2  1
3  0 
4  4
5  5

第0行(index = 3)应该比第4行(index = 4)获得更低的排名,然后是第5行(index = 5),即第0行和第4行的日期时间之后的一个日历日。换句话说,第4行不应该获得高于其副本第0行的排名,因为第4行出现在系列的后面。

以类似数据帧的格式显示所有这些可能更清楚:

index  original_index   Timestamp
  0        3            01/02/2017
  1        2            12/25/2016
  2        1            03/22/2014
  3        0            07/06/2011 
  4        4            01/02/2017
  5        5            01/03/2017

注意中间列上原始Series系列索引的序列更改。 (最左边的列是新的系列索引(自动生成))

回顾一下,以上是截尾日期。我在系列中使用了每个Timestamp的原始索引作为他们的排名。

1 个答案:

答案 0 :(得分:0)

IIUC您可以使用rank执行此操作:

In[61]:
df['rank'] = df['date'].rank(method='first').astype(int) -1
df

Out[61]: 
            date  rank
index                 
0     1993-03-25     9
1     1985-06-18     6
2     1971-07-08     1
3     1975-09-27     2
4     2000-02-06    10
5     1979-07-06     4
6     1978-05-18     3
7     1989-10-24     7
8     1989-10-24     8
9     1971-04-10     0
10    1985-05-11     5

修改

查看您想要的内容,reindex结果为rank

In[69]:
df.reindex(df['Timestamp'].rank(method='first').astype(int) -1).reset_index(drop=True)

Out[69]: 
   index  Timestamp
0      3 2011-07-06
1      2 2014-03-22
2      1 2016-12-25
3      0 2017-01-02
4      4 2017-01-02
5      5 2017-01-03