【问题标题】:How to use shift in pandas based on ranking column如何根据排名列在熊猫中使用移位
【发布时间】:2020-09-12 21:29:26
【问题描述】:

我有这样的数据。

我的数据如下所示。

我想根据排名获取上一个日期时间。当我使用 pandas shift(1) 函数时,我在第 9 行将 Previous Datetime 作为 '2019/10/15 00:00:00' 而不是 '2019/10/11 08:31:00' 和其他相同的方式发生对组进行排名。当等级相同时,我想要相同的上次时间。 以下是必需的结果。

  +------+---------------------+-----------------------+------+
| Rank |      DateTime       | Elapsed Time Previous | Name |
+------+---------------------+-----------------------+------+
|    1 | 2019/09/23 08:45:00 |                       |      |
|    2 | 2019/09/27 10:14:00 | 2019/09/23 08:45:00   |      |
|    3 | 2019/10/01 09:28:00 | 2019/09/27 10:14:00   |      |
|    4 | 2019/10/04 14:25:00 | 2019/10/01 09:28:00   |      |
|    5 | 2019/10/08 10:46:00 | 2019/10/04 14:25:00   |      |
|    6 | 2019/10/11 08:25:00 | 2019/10/08 10:46:00   |      |
|    7 | 2019/10/11 08:31:00 | 2019/10/11 08:25:00   |      |
|    8 | 2019/10/15 00:00:00 | 2019/10/11 08:31:00   |      |
|    8 | 2019/10/15 00:00:00 | 2019/10/11 08:31:00   |      |
|    1 | 2019/09/06 00:00:00 |                       |      |
|    2 | 2019/09/10 00:00:00 | 2019/09/06 00:00:00   |      |
|    3 | 2019/09/13 00:00:00 | 2019/09/10 00:00:00   |      |
|    4 | 2019/09/17 00:00:00 | 2019/09/13 00:00:00   |      |
|    5 | 2019/09/20 10:00:00 | 2019/09/17 00:00:00   |      |
|    6 | 2019/09/24 00:00:00 | 2019/09/20 10:00:00   |      |
|    7 | 2019/09/27 10:53:00 | 2019/09/24 00:00:00   |      |
|    8 | 2019/10/01 10:21:00 | 2019/09/27 10:53:00   |      |
|    9 | 2019/10/04 09:59:00 | 2019/10/01 10:21:00   |      |
|   10 | 2019/10/08 09:58:00 | 2019/10/04 09:59:00   |      |
|   11 | 2019/10/11 10:41:00 | 2019/10/08 09:58:00   |      |
|    1 | 2019/09/23 09:00:00 |                       |      |
|    2 | 2019/09/27 11:03:00 | 2019/09/23 09:00:00   |      |
|    3 | 2019/10/01 10:14:00 | 2019/09/27 11:03:00   |      |
|    4 | 2019/10/04 09:46:00 | 2019/10/01 10:14:00   |      |
|    5 | 2019/10/08 10:04:00 | 2019/10/04 09:46:00   |      |
|    6 | 2019/10/11 10:33:00 | 2019/10/08 10:04:00   |      |
|    7 | 2019/10/15 00:00:00 | 2019/10/11 10:33:00   |      |
|    7 | 2019/10/15 00:00:00 | 2019/10/11 10:33:00   |      |
+------+---------------------+-----------------------+------+

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    在将Rank 转换为索引后,使用DataFrame.drop_duplicatesSeriesSeries.shift,所以最后可以使用Series.map

    df['DateTime'] = pd.to_datetime(df['DateTime'])
    
    s = df.drop_duplicates('Rank').set_index('Rank')['DateTime'].shift()
    
    df['Previous Datetime'] = df['Rank'].map(s)
    print (df)
                 DateTime   Previous Datetime  Rank
    0 2019-09-06 00:00:00                 NaT     1
    1 2019-09-10 00:00:00 2019-09-06 00:00:00     2
    2 2019-09-13 00:00:00 2019-09-10 00:00:00     3
    3 2019-09-17 00:00:00 2019-09-13 00:00:00     4
    4 2019-09-20 10:00:00 2019-09-17 00:00:00     5
    5 2019-09-24 00:00:00 2019-09-20 10:00:00     6
    6 2019-09-27 10:21:00 2019-09-24 00:00:00     7
    7 2019-10-01 00:00:00 2019-09-27 10:21:00     8
    8 2019-10-01 00:00:00 2019-09-27 10:21:00     8
    

    编辑:

    df = df.drop('Elapsed Time Previous', axsi=1)
    
    df['DateTime'] = pd.to_datetime(df['DateTime'])
    
    # df['Elapsed Time Previous'] = 
    s = (df.drop_duplicates(['Rank','Name', 'ID'])
           .set_index(['Name', 'ID', 'Rank'])['DateTime']
           .unstack()
           .shift(axis=1)
           .stack()
           .rename('Elapsed Time Previous'))
    
    df = df.join(s, on=['Name','ID','Rank'])
    

    【讨论】:

    • 我确实在排名列中有多个排名组,并希望按此工作。在这种情况下,我只提到了一组。我正在根据条件分组创建排名列,并希望将日期时间从该组的最后排名转移。
    • @KaranJindal - 你能edit 对数据样本和预期输出提出问题吗,minimal, complete, and verifiable example
    • 我也更新了问题和示例结果...快速响应将不胜感激。提前致谢。
    • @KaranJindal - 每个组总是有Rank=1
    • 是的。我正在根据 groupby 条件计算排名,然后使用带有 method = 'min' 的 rank 函数
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2022-11-02
    • 2012-06-19
    相关资源
    最近更新 更多