gpt4 book ai didi

python - 将 Pandas 样式应用于数据框的任意(非产品)子集

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

如何将样式应用于 pandas 数据框的任意子集?具体来说,我有一个包含一些 NaN 的数据框 df,我想在所有地方应用背景渐变,除了有 NaN 的地方(对所有单元格应用相同的颜色图)。

我知道 background_gradient(和更一般的 applymap)有一个 subset 参数,但我从文档中不明白如何使用它选择数据框的任意子集。

import numpy as np
import pandas as pd

df = pd.DataFrame(data={'A': [0, 1, np.nan], 'B': [.5, np.nan, 0], 'C': [np.nan, 1, 1]})
mask = ~pd.isnull(df)

那如果我试试

df.style.background_gradient(subset=mask)

我得到错误:

IndexingError: Too many indexers

我知道如何在特定情况下将样式应用于数据框的子集,其中该子集是索引和列的笛卡尔积,使用类似于此处的解决方案:How do I style a subset of a pandas dataframe? .所以问题是当子集不是这样的产品时该怎么办,如上例所示。

一种解决方案可能是遍历各列并逐列应用样式(然后每个应用程序 都应用于笛卡尔积子集)。在我的例子中,我可以将 lowhigh 参数传递给 background_gradient 方法以强制颜色图在列之间匹配,但是当(如上所述)这些列中的一个或多个包含唯一的非 NaN 值。这反过来可以通过重写 background_gradient 函数来绕过,但这显然是不可取的。

最佳答案

您可以为此编写自定义函数:

from matplotlib.cm import get_cmap
cmap = get_cmap('PuBu')

# update with low-high option
def threshold(x,low=0,high=1,mid=0.5):
# nan cell
if np.isnan(x): return ''

# non-nan cell
x = (x-low)/(high-low)
background = f'background-color: rgba{cmap (x, bytes=True)}'
text_color = f'color: white' if x > mid else ''
return background+';'+text_color

# apply the style
df.style.applymap(threshold, low=-1, high=1, mid=0.3)

输出:

enter image description here

关于python - 将 Pandas 样式应用于数据框的任意(非产品)子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58087857/

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