Python: цвет фона в стиле Pandas не отображается в файле Excel - PullRequest
2 голосов
/ 25 мая 2019

Я создаю файл Excel с несколькими листами, используя xlsxwriter в качестве движка.

В каждом листе цвет строки зависит от значения столбца с именем colour

Но цвет не виден в моем файле Excel.

import pandas as pd

def row_colour(row):
    return ['background-color:'+row.colour.lower()for i in row]


writer = pd.ExcelWriter('try.xlsx', engine='xlsxwriter')

cols = ['subject','colour']
df1 = pd.DataFrame([['Math','DarkRed'],['Science','Yellow']],columns=cols)

df2 = pd.DataFrame([['English','Orange'],['History','Green']],columns=cols)

df3 = pd.DataFrame([['Geography','DarkRed'],['Civic','Yellow']],columns=cols)

df1.style.apply(row_colour,axis=1)
df2.style.apply(row_colour,axis=1)
df3.style.apply(row_colour,axis=1)

df1.to_excel(writer, sheet_name='Sheet 1')
df2.to_excel(writer, sheet_name='Sheet 2')
df3.to_excel(writer, sheet_name='Sheet 3')

writer.save()

На выходе цвет не виден:

enter image description here

Принятый ответ является правильным для вышеуказанного вопроса.

Я улучшил задачу, удалив столбец цвета, поскольку он использовался только для окрашивания строк.

Код для этого:

import pandas as pd

def row_colour(table,color):
    print("table: \n "+str(table))
    print("table shape : "+str(table.shape))
    color_data = []

    for index,row in table.iterrows():
        color.iloc[index]
        if str(color.iloc[index]['colour']) == "DarkRed":
            c= 'background-color:red'
        else:
            c= 'background-color:'+str(color.iloc[index]['colour'])
        color_data.append([c for i in range(len(row))])


    return pd.DataFrame(color_data,index=table.index, columns=table.columns)


writer = pd.ExcelWriter('try.xlsx', engine='xlsxwriter')

cols = ['subject','colour']
df1 = pd.DataFrame([['Math','DarkRed'],['Science','Yellow']],columns=cols)

df2 = pd.DataFrame([['English','Orange'],['History','Green']],columns=cols)

df3 = pd.DataFrame([['Geography','DarkRed'],['Civic','Yellow']],columns=cols)

color = pd.DataFrame(columns=['colour'])
color['colour']=df1['colour']
df1 = df1.drop(['colour'],axis=1)
df1=df1.style.apply(row_colour,axis=None,color=color)

color = pd.DataFrame(columns=['colour'])
color['colour']=df2['colour']
df2=df2.drop(['colour'],axis=1)
df2=df2.style.apply(row_colour,axis=None,color=color)

color = pd.DataFrame(columns=['colour'])
color['colour']=df3['colour']
df3=df3.drop(['colour'],axis=1)
df3=df3.style.apply(row_colour,axis=None,color=color)

df1.to_excel(writer, sheet_name='Sheet 1')
df2.to_excel(writer, sheet_name='Sheet 2')
df3.to_excel(writer, sheet_name='Sheet 3')

writer.save()


Ответы [ 2 ]

1 голос
/ 25 мая 2019

Функция в порядке, вам просто нужно переназначить df1, df2, df3. Это должно работать:

import pandas as pd

def row_colour(row):
    return ['background-color:'+row.colour.lower()for i in row]


writer = pd.ExcelWriter('try.xlsx', engine='xlsxwriter')

cols = ['subject','colour']
df1 = pd.DataFrame([['Math','DarkRed'],['Science','Yellow']],columns=cols)
df2 = pd.DataFrame([['English','Orange'],['History','Green']],columns=cols)
df3 = pd.DataFrame([['Geography','DarkRed'],['Civic','Yellow']],columns=cols)

df1 = df1.style.apply(row_colour,axis=1)
df2 = df2.style.apply(row_colour,axis=1)
df3 = df3.style.apply(row_colour,axis=1)

df1.to_excel(writer, sheet_name='Sheet 1')
df2.to_excel(writer, sheet_name='Sheet 2')
df3.to_excel(writer, sheet_name='Sheet 3')

writer.save()

to_excel - это метод pandas.io.formats.style.Styler, а не исходный фрейм данных.

0 голосов
/ 25 мая 2019

В качестве ответа на ваш комментарий я предложил более сложное решение.Цвета теперь считываются из DataFrame, а затем отбрасываются.Затем передается в качестве аргумента функции окраски строк.Ключевыми моментами являются мое использование zip и pd.IndexSlice для поднабора df.style.apply.Я надеюсь, что это соответствует вашим потребностям в окраске.

import pandas as pd

def colour_row(row, colour):
    return ['background-color:'+ colour.lower() for i in row]

def colour_df(df, colour_col):
    colours = list(df['colour'])
    df = df.drop('colour', axis = 1)
    coloured_df = df.style
    for i, colour in zip(range(len(df)), colours):
        coloured_df = coloured_df.apply(colour_row, axis=1, subset=pd.IndexSlice[i,:], colour=colour)
    return coloured_df

writer = pd.ExcelWriter('try.xlsx', engine='xlsxwriter')

cols = ['subject','colour']
df1 = pd.DataFrame([['Math','DarkRed'],['Science','Yellow']],columns=cols)
df2 = pd.DataFrame([['English','Orange'],['History','Green']],columns=cols)
df3 = pd.DataFrame([['Geography','DarkRed'],['Civic','Yellow']],columns=cols)


sheet_num = 1
for df in [df1, df2, df3]:
    sheet_name = 'Sheet ' + str(sheet_num)
    df = colour_df(df, 'colour')
    df.to_excel(writer, sheet_name = sheet_name)
    sheet_num += 1
writer.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...