gpt4 book ai didi

python - Pandas 设置元素样式依赖于另一个带有多重索引的数据框

转载 作者:太空宇宙 更新时间:2023-11-03 14:18:44 25 4
gpt4 key购买 nike

我之前问过这个问题Pandas set element style dependent on another dataframe ,我有一个可行的解决方案,但现在我尝试将其应用于具有多索引的数据框,但出现错误,我不明白。

问题

我有一个 pandas df 和附带的 bool 矩阵。我想根据 bool 矩阵突出显示 df。

数据

import pandas as pd
import numpy as np
from datetime import datetime

date = pd.date_range(start = datetime(2016,1,1), end = datetime(2016,2,1), freq = "D")
i = len(date)
dic = {'X':pd.DataFrame(np.random.randn(i, 2),index = date, columns = ['A','B']),
'Y':pd.DataFrame(np.random.randn(i, 2),index = date, columns = ['A','B']),
'Z':pd.DataFrame(np.random.randn(i, 2),index = date, columns = ['A','B'])}
df = pd.concat(dic.values(),axis=1,keys=dic.keys())


boo = [True, False]
bool_matrix = {'X':pd.DataFrame(np.random.choice(boo, (i,2), p=[0.3,.7]), index = date, columns = ['A','B']),
'Y':pd.DataFrame(np.random.choice(boo, (i,2), p=[0.3,.7]), index = date, columns = ['A','B']),
'Z':pd.DataFrame(np.random.choice(boo, (i,2), p=[0.3,.7]), index = date, columns = ['A','B'])}

bool_matrix =pd.concat(bool_matrix.values(),axis=1,keys=bool_matrix.keys())

我尝试的解决方案

def highlight(value):
return 'background-color: green'
my_style = df.style
for column in df.columns:
for i in df[column].index:
data = bool_matrix.loc[i, column]
if data:
my_style = df.style.use(my_style.export()).applymap(highlight, subset = pd.IndexSlice[i, column])

my_style

结果

上面抛出一个 AttributeError: 'Series' 对象没有属性 'applymap'

我不明白什么是系列回归。这是我正在子集化的单个值,该解决方案适用于非多索引 df,如下所示。

没有多索引

import pandas as pd
import numpy as np
from datetime import datetime
np.random.seed(24)
date = pd.date_range(start = datetime(2016,1,1), end = datetime(2016,2,1), freq = "D")
df = pd.DataFrame({'A': np.linspace(1, 100, len(date))})
df = pd.concat([df, pd.DataFrame(np.random.randn(len(date), 4), columns=list('BCDE'))],
axis=1)

df['date'] = date
df.set_index("date", inplace = True)

boo = [True, False]
bool_matrix = pd.DataFrame(np.random.choice(boo, (len(date), 5),p=[0.3,.7]), index = date,columns=list('ABCDE'))

def highlight(value):
return 'background-color: green'
my_style = df.style
for column in df.columns:
for i in bool_matrix.index:
data = bool_matrix.loc[i, column]
if data:
my_style = df.style.use(my_style.export()).applymap(highlight, subset = pd.IndexSlice[i,column])
my_style

文档

docs引用 CSS 类并说“索引标签单元包含级别,其中 k 是 MultiIndex 中的级别。”我显然索引了这个错误,但我不知道如何继续。

最佳答案

很高兴有一个可运行的示例。

您可以使用df.style.apply(..., axis=None)将突出显示方法应用于整个数据框。

与您的dfbool_matrix ,试试这个:

def highlight(value):
d = value.copy()
for c in d.columns:
for r in df.index:
if bool_matrix.loc[r, c]:
d.loc[r, c] = 'background-color: green'
else:
d.loc[r, c] = ''
return d

df.style.apply(highlight, axis=None)

或者为了让代码变得简单,你可以尝试:

def highlight(value):
return bool_matrix.applymap(lambda x: 'background-color: green' if x else '')

df.style.apply(highlight, axis=None)

希望这是您所需要的。

关于python - Pandas 设置元素样式依赖于另一个带有多重索引的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com