【问题标题】:Compare multiple dates columns by row ID and highlight them in python or pandas按行 ID 比较多个日期列并在 python 或 pandas 中突出显示它们
【发布时间】:2021-12-20 09:08:30
【问题描述】:

对于整个数据框,我需要比较同一行上的 4 个日期。找到最新的日期并突出显示它。 突出显示的单元格是 comp1 - comp4 之间的最高单元。

我需要的输出如下所示:

我首先确保所有 comps 都是日期时间 dtypes,我什至尝试将它们制作为对象并在编写本文之前进行比较,但没有运气。

这是我在网上尝试/搜索的内容,但这些都不起作用:

checks.style.highlight_max(color= 'yellow', axis=0)

没有突出显示

我也尝试使用子集,但由于某种原因,无论是否检查每个组合上的 dtype,它们都不会保留日期时间或对象,而是由于某些奇怪的原因变成浮点数

checks.style.highlight_max(color= 'yellow', axis=0, subset=['CAC Clearance', 'ASB Results Received','Arch Assessment','Bio Assessment'])

这是我得到的错误,但我在运行它之前将它们全部作为日期时间。

TypeError: 'float' 和 'datetime.date' 的实例之间不支持 '>='

最后我尝试通过 ID 进行分组,即使这样我似乎也无法让它工作。

使用print(checks.head().to_records())/print(checks.head().to_dict())的示例日期

输出(目前只能提供某些信息时间戳)

TypeError Traceback(最近一次调用最后一次) 在 ----> 1 次打印(checks.head().to_records())/打印(checks.head().to_dict())

TypeError: /: 'NoneType' 和 'NoneType' 的操作数类型不受支持

第一个打印示例:

'2021-10-13T00:00:00.000000000', '2021-10-13T00:00:00.000000000')

第二个打印示例:

Timestamp('2021-10-13 00:00:00'), 4: Timestamp('2021-10-13 00:00:00')}, '生物评估': {0: Timestamp('2021 -10-13 00:00:00'), 1: 时间戳('2021-10-14 00:00:00'), 2: 时间戳('2021-10-13 00:00:00'), 3:时间戳('2021-10-13 00:00:00'), 4: 时间戳('2021-10-13 00:00:00')}}

【问题讨论】:

  • 请不要链接或嵌入源代码或数据的外部图像。图像难以有效地为您提供帮助,因为它们无法复制,并且由于无法搜索而可用性差。请参阅:Why not upload images of code/errors when asking a question? 如果您需要帮助将 DataFrame 的一个小样本格式化为 SO 的可复制代码,请参阅How to make good reproducible pandas examples
  • 可能您缺少数据,这意味着您在一行中有NaN,其中包含日期并且无法排序。如果您提供 DataFrame print(checks.head().to_records())/print(checks.head().to_dict()) 的样本,这个问题会更容易回答。因为不可能仅从这张图片中导出 DataFrame 的底层数据类型。
  • 哇,真快。请原谅我的图片。我试图只是复制过去的示例表单 excel,然后它就这样上传了。只是想弄清楚。此外,将使用尝试显示原始帖子中的数据示例,但必须编辑其中的一些内容。
  • 当然是在 NaTs。我会改变它并尝试格式化日期,以显示年月日,看看是否有效

标签: python pandas pandas-styles


【解决方案1】:

我想通了。

  • 首先必须复制我的 df 以停止复制警告

  • 然后使用此代码制作我所有的日期时间字符串并用“0”填写 NaT。这是我可以比较 str/int 到 datetime/timestamp 错误的唯一方法:

    checks['comp1'] = checks['comp1'].dt.strftime('%Y-%m-%d').fillna("0")

  • 我尝试在原始帖子中使用上面的突出显示样式,但只有几个日期会突出显示,所以我制作了这个函数,它会输出一个包含我需要的信息的新列。

     def find_lastest_date(df, comp1, comp2, comp3, comp4, comp5):
      # Debris not finished
      if df[comp1] == "0":
          return 'No "comp1" Date'
    
    
    
      # compares comp1 to all other comps
      if ((df[comp1] > df[comp2]) & (df[comp1] > df[comp3]) & (df[comp1] > df[comp4]) & (df[comp1] > df[comp5])):
          return '"comp1" is greater than Latest Date'
      # compares comp2 to all other comps
      elif ((df[comp2] > df[comp1]) & (df[comp2] >= df[comp3]) & (df[comp2] >= df[comp4]) & (df[comp2] >= df[comp5])):
          return "'comp2' Latest/has other matching dates"
      # compares comp3 to all other comps
      elif  ((df[comp3] > df[comp1]) & (df[comp3] >= df[comp2]) & (df[comp3] >= df[comp4]) & (df[comp3] >= df[comp5])):
          return '"comp3" Latest/has other matching dates'
      # compares comp4 to all other comps
      elif ((df[comp4] > df[comp1]) & (df[comp4] >= df[comp2]) & (df[comp4] >= df[comp3]) & (df[comp4] >= df[comp5])):
          return '"comp4" Latest/has other matching dates'
      elif((df[comp5] > df[comp1]) & (df[comp5] >= df[comp2]) & (df[comp5] >= df[comp3]) & (df[comp5] >= df[comp4])):
           return '"comp45" Latest/has other matching dates'
    
      # Comp matches
    
      # All comps == "0" leave blank
      elif ((df[comp1] == "0") & (df[comp2] == "0") & (df[comp3] == "0") & (df[comp4] == "0") & (df[comp5] == "0")):
          return ""
    
    
      # All comps macth
      elif ((df[comp1] == df[comp2]) & (df[comp1] == df[comp3]) & (df[comp1] == df[comp4]) & (df[comp1] == df[comp5])):
          return "'comp1' matches Latest Date"
    
      # comp1 match to another other comp
      elif ((df[comp1] == df[comp2]) | (df[comp1] == df[comp3]) | (df[comp1] == df[comp4]) | (df[comp1] == df[comp5])):
          return "'comp1' matches Latest Date"
      else:
          return ""
    

这是我调用此函数的方式,它创建一个新列并将其插入到我想要的列索引中:

df.insert(df.columns.get_loc('comp1'), 'Output column name', df.apply(find_lastest_date, comp1='comp1', comp2='2comp2', comp3='comp3, comp4='comp4',comp5='comp5',axis=1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2018-08-08
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多