Кадр данных Python для панд в html - выделение всего столбца на основе значения заголовка - PullRequest
0 голосов
/ 28 марта 2019

У меня есть датафрейм (извлеченный из словаря), который содержит дни недели текущей недели в виде заголовков столбцов, заполненных именами людей в строках

* 1003 Т.е. *

dict = {'2019-03-25': ['Bob', '', 'Joe'], '2019-03-26': ['Abel', '', ''], '2019-03-27': ['', '', ''], '2019-03-28': ['', 'Bob', ''], '2019-03-29': ['Richard', 'Joe', 'Fred']}

df = pd.DataFrame(data=dict)

currentdate = datetime.datetime.today().strftime('%Y-%m-%d')

Я хотел бы выделить все ячейки во всем столбце, где заголовок столбца = currentdate, а затем преобразовать это в html

Я искал в другом месте и считаю, что это уникальный сценарий, поскольку все, что я мог найти в Интернете, было связано с выделением, основанным на значениях самих ячеек, например, Значение больше или меньше или содержит определенный текст, но ничего не связано со значением в самом заголовке столбца.

EDIT: По сути, у меня есть календарь в Excel, который я извлекаю в фрейм данных, затем конвертирую в HTML и отправляю по электронной почте. Ниже приведен результат, который я получил (минус основные моменты). Я хотел бы создать оператор if для форматирования HTML, чтобы он выделил желтый столбец, когда header == текущая дата.

enter image description here

1 Ответ

0 голосов
/ 30 апреля 2019

Обратите внимание, что не рекомендуется хранить данные в качестве имени столбца.В данном случае это означает запись даты.Это также делает код намного более сложным.

Попробуйте этот фрагмент кода - я добавил комментарии по пути.

import pandas as pd

# note that I've replaced '' with None
d = {'2019-04-30': ['Bob', None, 'Joe'], '2019-03-26': ['Abel', None, None], '2019-03-27': [None, None, None], '2019-03-28': [None, 'Bob', None], '2019-03-29': ['Richard', 'Joe', 'Fred']}

# load items of dictionary as dataframe, don't use dates as column names, assign column names
df = pd.DataFrame(data=d.items(), columns = ['date','name_list'])

# convert string to datetime
# it's better to compare datetimes directly, and forces the type to datetime, in case of dirty data
# also using pandas datetime instead of the standard python library
df.date = pd.to_datetime(df.date)

# this is your filter or 'where' clause, to keep only records that match today
df = df.loc[df['date'] == pd.to_datetime('today')]

# unpack list as individual rows, see https://stackoverflow.com/a/12681217/2327328
df = pd.concat([pd.Series(row['date'], row['name_list'])              
                for _, row in df.iterrows()]).reset_index()


# display as html
print (df.to_html())

Предоставляет в качестве вывода:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>index</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>Bob</td>
      <td>2019-04-30</td>
    </tr>
    <tr>
      <th>1</th>
      <td>None</td>
      <td>2019-04-30</td>
    </tr>
    <tr>
      <th>2</th>
      <td>Joe</td>
      <td>2019-04-30</td>
    </tr>
  </tbody>
</table>

, который выглядит, отображает это:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...