Установка значения и стиля (цвета) ячейки в пандах Dataframe одновременно в цикле - PullRequest
1 голос
/ 11 июня 2019

Я написал программу на Python для поиска и исправления синтаксических ошибок в таблице Excel.Эта часть работает.

Если в ячейке имеется исправимая синтаксическая ошибка, значение в ячейке должно быть фиксированным, а ячейка выделена желтым цветом.

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

Я могу обновить значение ячейки или выделить его, но все мои попытки сделать оба не удаются.

Я использовал такие команды, как

df.at[row,col] = value

, чтобы обновитьиндивидуальная ячейка, и это работает.И

def colorCell(df):
    color = 'background-color: red; font-weight: bold'

    dfTemp = pd.DataFrame("", index=df.index, columns=df.columns)

    for i in df[df["UserId"].str.match(userIdPat) != True]["UserId"].index:
        dfTemp.at[i,"UserId"] = color

    for i in df[df["Phone Number"].str.match(phonePat) != True]["Phone Number"].index:
        dfTemp.at[i,"Phone Number"] = color

    for i in df[df["MAC Address"].str.match(macPat) != True]["MAC Address"].index:
        dfTemp.at[i,"MAC Address"] = color

    return dfTemp

df2 = df.style.apply(colorCell, axis=None)

для окраски ячеек, но я не могу получить одновременно установку значения и стиля для работы.

Часть проблемы заключается в том, чтоЯ изменяю значение на месте (df), в то время как я создаю новый фрейм данных, чтобы установить цвет (df2).Если я записываю df2 обратно в df, я получаю ошибки, что « AttributeError: объект« Styler »не имеет атрибута» в «», когда я в следующий раз пытаюсь установить другое значение ячейки, используя

df.at[row,col] = value

Я уверен, что есть простое исправление для этого, но я просто не вижу его.

Спасибо!

1 Ответ

0 голосов
/ 12 июня 2019

@ user545424 Спасибо, что предложили выложить короткий пример.Тем самым я решил свою проблему.

Моя первоначальная проблема заключалась в том, что мне приходилось разделять кадры данных, один для данных, а другой для стиля.Придумывая короткий пример, я нашел способ сделать все с одним фреймом данных (я очень плохо знаком с python и pandas).

Исправление, которое я придумал, заключается в создании оригинального фрейма данных, в том числе ".style ".

Итак, вместо этой команды (которую я использовал):

df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD'))

Теперь я создаю df, используя эту команду:

df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD')).style

Теперь, когда я хочу получить доступ / изменить часть данных df, я называю ее «df.data», а когда я хочу применить стилевую часть df, я называю ее «df.apply».Таким образом, я могу получить доступ как к данным, так и к стилю с одного фрейма данных.Вот пример кода, который я писал, когда обнаружил свой ответ:

import numpy as np
import pandas as pd

def colorCell(df, row=None, column=None, color="red"):
    color = f"background-color: {color}; font-weight: bold"
    dfTemp = pd.DataFrame("", index=df.index, columns=df.columns)
    dfTemp.at[row,column] = color
    return dfTemp

# Create the dataframe including styles.
df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD')).style

# Update location [1,"A"] and set it to "red".
df.data.loc[1,"A"] = 999
df.apply(colorCell, row=1, column="A", color="red", axis=None)

# Update location [2,"B"] and set it to "yellow".
df.data.loc[2,"B"] = 999
df.apply(colorCell, row=2, column="B", color="yellow", axis=None)

Как я уже говорил выше, я очень плохо знаком с Python и даже новее с пандами.Так что, если вышеперечисленное работает, есть ли лучший способ сделать это?

Спасибо!

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