【问题标题】:Replacing values of rows with same ID with max date用最大日期替换具有相同 ID 的行的值
【发布时间】:2020-11-05 20:36:46
【问题描述】:

以下是相关 df 的简化版本的脚本:

import pandas as pd
    
df = pd.DataFrame({ 
                   'id': ['1', '1','2','2','3','3','4','4','5','6','7'],
                   'product1_expiry_date' : ['-','-','2020-11-28','2020-11-13','-',
                                             '2020-11-13','2020-12-13','-','2020-11-16','-',
                                             '2020-11-28'],
                   'product2_expiry_date' : ['2020-11-16','2020-11-19','-',
                                             '-','2020-11-23','2020-11-13',
                                             '2020-12-13','-','2020-12-01','2020-12-01',
                                             '2020-12-14']
                 })
 df

id  product1_expiry_date    product2_expiry_date
1            -                   2020-11-16
1            -                   2020-11-19
2        2020-11-28                  -
2        2020-11-13                  -
3            -                   2020-11-23
3        2020-11-13              2020-11-13
4        2020-12-13              2020-12-13
4            -                         -
5        2020-11-16              2020-12-01
6            -                   2020-12-01
7        2020-11-28              2020-12-14

我不希望有重复的 ID,对于每个 ID,删除较早的日期和适用的“-”值。因为我只对以后的日期感兴趣。

预期的 DF:

   id   product1_expiry_date    product2_expiry_date
    1            -                  2020-11-19
    2        2020-11-28                 -
    3        2020-11-13             2020-11-23
    4        2020-11-13             2020-11-13
    5        2020-12-13             2020-12-13
    6        2020-11-16             2020-12-01
    7        2020-11-28             2020-12-14

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Id 转换为索引,然后将所有列转换为日期时间并为每个索引使用max

    f = lambda x: pd.to_datetime(x, errors='coerce')
    df1 = df.set_index('id').apply(f).max(level=0)
    print (df1)
       product1_expiry_date product2_expiry_date
    id                                          
    1                   NaT           2020-11-19
    2            2020-11-28                  NaT
    3            2020-11-13           2020-11-23
    4            2020-12-13           2020-12-13
    5            2020-11-16           2020-12-01
    6                   NaT           2020-12-01
    7            2020-11-28           2020-12-14
    

    如果想将NaT 替换为- 是可能的,但是会得到带有字符串的混合日期时间,所以接下来的处理应该是问题:

    f = lambda x: pd.to_datetime(x, errors='coerce')
    df1 = df.set_index('id').apply(f).max(level=0).fillna('-')
    print (df1)
       product1_expiry_date product2_expiry_date
    id                                          
    1                     -  2020-11-19 00:00:00
    2   2020-11-28 00:00:00                    -
    3   2020-11-13 00:00:00  2020-11-23 00:00:00
    4   2020-12-13 00:00:00  2020-12-13 00:00:00
    5   2020-11-16 00:00:00  2020-12-01 00:00:00
    6                     -  2020-12-01 00:00:00
    7   2020-11-28 00:00:00  2020-12-14 00:00:00
    

    如有必要,最后id 到列:

    df1 = df1.reset_index()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多