df.style.applymap을 사용하여 여러 시트 Excel의 색상 셀 배경에

Nov 16 2020

의 도움으로 만든 MRE https://jakevdp.github.io/PythonDataScienceHandbook/03.05-hierarchical-indexing.html, 계층 적 인덱싱에 대한 놀라운 요약

MRE :

index = pd.MultiIndex.from_product([[2013, 2014,2015, 2016]],
                                   names=['year'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'group']])

data = np.array([[1,2,3,4,5,"g1"],
                 [3,6,1,3,2,"g2"],
                 [3,6,1,2,3,"g1"],
                 [6,7,8,11,23,"g2"]])

all_df = pd.DataFrame(data, index=index, columns=columns)

하나의 df를 사용하고 조건에 따라 셀의 배경을 채색하면 잘 작동하지만 여러 시트에 적용하려고하면 작동하지 않는 것 같습니다.

내 코드는 다음과 같습니다.

def coloring(val):
    color = '#EDFFE7' if val in lst else 'white'
    return f"background-color: {color}"


groups = ["g1", "g2"]
writer = pd.ExcelWriter("test.xlsx", engine="xlsxwriter")
for g in groups:
    df = all_df.loc[all_df[("Sue","group")] == g].copy()
    df.style.applymap(coloring).to_excel(writer, sheet_name=g)
writer.save()

또한 applymap 메서드에서 하위 집합 매개 변수에 대한 인덱스를 추가하는 방법은 무엇입니까?

답변

jezrael Nov 16 2020 at 07:04

df.style.applymap(coloring)다시 할당되지 않았기 때문에 두 행을 모두 연결해야하는 것 같습니다 .

df.style.applymap(coloring).to_excel(writer, sheet_name=g)

대신 :

df.style.applymap(coloring)
df.to_excel(writer, sheet_name=g)

또는 다시 할당 :

df = df.style.applymap(coloring)
df.to_excel(writer, sheet_name=g)

편집하다:

나를 위해 잘 작동하는 경우 목록의 값이 정수이면 np.array혼합 데이터에 사용하면 숫자가 numpy 인 문자열이 모든 데이터를 객체로 변환하기 때문입니다.

index = pd.MultiIndex.from_product([[2013, 2014,2015, 2016]],
                                   names=['year'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'group']])

data = np.array([[1,2,3,4,5,"g1"],
                 [3,6,1,3,2,"g2"],
                 [3,6,1,2,3,"g1"],
                 [6,7,8,11,23,"g2"]])

all_df = pd.DataFrame(data, index=index, columns=columns)

print (all_df.dtypes)

Bob    HR       object
       group    object
Guido  HR       object
       group    object
Sue    HR       object
       group    object
dtype: object

따라서 중첩 된 목록을 DataFrame모든 사람 에게 전달하면 잘 작동합니다.

index = pd.MultiIndex.from_product([[2013, 2014,2015, 2016]],
                                   names=['year'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'group']])

data = [[1,2,3,4,5,"g1"],
        [3,6,1,3,2,"g2"],
        [3,6,1,2,3,"g1"],
        [6,7,8,11,23,"g2"]]

all_df = pd.DataFrame(data, index=index, columns=columns)

print (all_df.dtypes)
Bob    HR        int64
       group     int64
Guido  HR        int64
       group     int64
Sue    HR        int64
       group    object
dtype: object

def coloring(val):
    color = '#EDFFE7' if val in lst else 'white'
    return f"background-color: {color}"

writer = pd.ExcelWriter("test.xlsx", engine="xlsxwriter")

groups = ["g1", "g2"]
lst = [1,2,3]


for g in groups:
    df = all_df.loc[all_df[("Sue","group")] == g].copy()
    #print (df)
    df.style.applymap(coloring).to_excel(writer, sheet_name=g)

writer.save()