如果找到某些值,则突出显示python pandas数据框

问题描述 投票:0回答:1

来自“ Pandas Cookbook”第7章的最后一个示例,使用flight.csv数据集。目的是为每个航空公司和始发机场组合找到最长的延误条纹。我对自己做了一些修改。

def max_delay_streak(df):
  df = df.reset_index(drop=True)
  s = 1- df['ON_TIME']
  s1 = s.cumsum()
  streak = s.mul(s1).diff().where(lambda x: x < 0).ffill().add(s1, fill_value =0)
  df['streak'] = streak
  last_idx = streak.idxmax()
  max_streak = streak.max()

  # my slight modification here to accommodate delay streak equals 0
  if max_streak == 0:
      first_idx = 0
  else:
     first_idx = last_idx - max_streak + 1

  df_return = df.loc[[first_idx, last_idx],['MONTH','DAY']]
  df_return['streak'] = max_streak  
  df_return.index = ['first','last']
  df_return.index.name = 'streak_row'

  # search and operate zero streak

  # my adjustment to find index where there is no delay streak
  # df_return[df_return['streak'] == 0].index
  # gets the MultiIndex([('EV', 'PHX', 'first'), ('EV', 'PHX',  'last')],
  #      names=['AIRLINE', 'ORG_AIR', 'streak_row'])
  no_streak = df_return[df_return['streak'] == 0].index
  # get the data from respective index and return month/day into '-'
  df_return.loc[no_streak,['MONTH','DAY']] = '-'
  return df_return 

  flights.sort_values(['MONTH','DAY','SCHED_DEP']).groupby(['AIRLINE','ORG_AIR']).apply(max_delay_streak)

代码在这里运行正常。接下来,我尝试以黄色突出显示延迟条纹为0(或任何其他数字)的行。

desired_result

我尝试了2种方法,该程序无错误运行,并生成原始数据帧而没有突出显示任何内容。

方法1:在上述程序的最后一行中重用.loc逻辑,以使用索引进入特定行以添加颜色。

df_return.loc[no_streak].style.apply('background-color: yellow',axis=1)

方法2:一种丑陋的方式。我尝试提取所有(航空公司,始发机场,第一/最后)索引,并根据零延迟条纹索引对其进行检查,其中信息存储在变量“ no_streak”(在这种情况下为“'EV','PHX',' first')(('EV','PHX','last'))。如果满足条件,则应用颜色。

df_return.style.apply(['background-color: yellow' for x in list(df_return.index) if x in list(no_streak)], axis=1)

为什么我的代码无法获得所需的图片?是否有可能达到目标?

python pandas styles highlight
1个回答
0
投票

在max_delay_streak()函数外部执行样式。

import pandas as pd
flights = pd.read_csv('flights.csv')
flights['ON_TIME'] = flights['ARR_DELAY'].lt(15).astype(int)
flights_agg = flights.sort_values(['MONTH', 'DAY', 'SCHED_DEP']).groupby(['AIRLINE', 'ORG_AIR']).apply(max_delay_streak)
flights_agg.style.apply(lambda x: ['background-color: yellow']*3 if x.streak == 0 else ['background-color: default']*3, axis=1)

其中max_delay_streak()是问题中定义的函数。

© www.soinside.com 2019 - 2024. All rights reserved.