使用具有多个映射函数的 pandas applymap()

Using pandas applymap() with multiple mapping functions

我正在使用 df.to_excel() 将数据从 pandas 数据帧输出到 excel。为了提高可读性,我使用 df.style.applymap() 根据内容更改单元格的颜色。

假设我有一个如下所示的数据框:

df = 
       Account  Revenue   AccountAge
0     "Boeing"     5000          5.6
1   "Lockheed"   -10000          1.2
2     "Airbus"    12000          0.6
3   "Northrop"    -3000          8.4

其中帐户年龄表示我在我的账簿上使用此帐户的时间。也许我想将负收入单元格标记为红色。我能做到:

def color_neg_revenue(val):
    if val < 0:
        color = 'red'
    return "background-color: %s" % color

df = df.style.applymap(color_neg_revenue, subset=["Revenue"])

我可以将其导出到 excel,格式看起来很棒!但是假设我还想用黄色标记新帐户,当我尝试时:

def color_new_account(val):
    if val < 3:
        color = 'yellow'
    return "background-color: %s" % color

df = df.style.applymap(color_new_account, subset=["AccountAge"])

我得到:

AttributeError: 'Styler' object has no attribute 'style'

为什么我不能在已经使用 applymap() 的数据帧上使用 applymap()?我该如何解决这个问题?

问题不在于函数。在您的第一次通话中,您执行:

<s><b>df =</b> df.style.applymap(color_neg_revenue, subset=["Revenue"])</s>

所以现在 df 不再是 DataFrame,而是 Styler。这样的Styler当然没有.style属性了。因此,您最好将其分配给另一个变量,然后链接到那个变量。喜欢:

<b>s =</b> df.style.applymap(color_neg_revenue, subset=["Revenue"])

# Look mom, no I have no .style
<b>s</b> = s.applymap(color_new_account, subset=["AccountAge"])

因此,当您使用 Styler 时,您可以 chain 这样的 applymap 调用,但是这样的样式器本身没有 .style 属性。