熊猫风格的循环无法正常工作

Posted

技术标签:

【中文标题】熊猫风格的循环无法正常工作【英文标题】:Pandas style for loop not working correctly 【发布时间】:2021-12-06 14:59:51 【问题描述】:

我在 Pandas 中有一个数据框,其中包含行星名称和每个行星的信息。行星名称存储在标题为“行星”的列下。我想突出显示特定行星、地球、土星和火星的行。出于某种原因,当我运行此脚本并导出为 Excel 文件时,只有 highlight_planets 列表中的第一个行星被突出显示。在这种情况下,只有地球被突出显示(土星和火星没有被突出显示)。如果我将土星移动到第一个位置并将地球移动到第二个位置,则只有土星行会在数据框中突出显示。如何突出显示我的行星列包含地球、土星或火星的所有行?

谢谢。

def highlight_sentiment(row):

    highlight_planets = ['Earth', 'Saturn', 'Mars']

    for m in highlight_planets:


        if row['planet'] == m:
           return ['background-color: yellow'] * len(row)
        else:
           return ['background-color: white'] * len(row)

df.style.apply(highlight_sentiment, axis=1)

df = df.style.apply(highlight_sentiment, axis=1)
df.to_excel("df_test.xlsx", index = False)

【问题讨论】:

【参考方案1】:

在您的for 循环中,如果行星不是您列表中的first 值,则立即return

将最后一个return 语句移到for 循环之外,这样它只会在行星与列表中的任何 值不匹配时返回白色背景。

def highlight_sentiment(row):
    highlight_planets = ['Earth', 'Saturn', 'Mars']
    for m in highlight_planets:
        if row['planet'] == m:
           return ['background-color: yellow'] * len(row)
    return ['background-color: white'] * len(row)

顺便说一句,您可以完全避免 for 循环而只使用 in

def highlight_sentiment(row):
    highlight_planets = ['Earth', 'Saturn', 'Mars']
    if row['planet'] in highlight_planets:
        return ['background-color: yellow'] * len(row)
    return ['background-color: white'] * len(row)

【讨论】:

【参考方案2】:

解决这个问题的更标准的方法是构建一个样式的 DataFrame,可以使用loc + Series.isin 根据行星在列表中的位置动态构建样式:

def highlight_sentiment(df_, highlight_planets):
    # Build DataFrame With Default Style
    styles_df = pd.DataFrame('background-color: white',
                             index=df_.index,
                             columns=df_.columns)
    # Update Styles based on condition
    styles_df.loc[
        df_['planet'].isin(highlight_planets), :
    ] = 'background-color: yellow'
    return styles_df


# Pass highlight_planets as an argument to allow more flexible styles
styler = df.style.apply(highlight_sentiment,
                        highlight_planets=['Earth', 'Saturn', 'Mars'],
                        axis=None)
# Use styler to write to excel
styler.to_excel("df_test.xlsx", index=False)


示例数据和导入:

import pandas as pd

df = pd.DataFrame(
    'planet': ['Mercury', 'Venus', 'Earth',
               'Mars', 'Jupiter', 'Saturn'],
    'data': [1, 2, 3, 4, 5, 6]
)

【讨论】:

看到“Jupiter”而不是“Jupyter”真是太奇怪了,呵呵 :)。向我 +1! 我先用了一个 y。然后我记得这是行星XD

以上是关于熊猫风格的循环无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

LibGDX - 渲染愤怒的小鸟风格动画分数计数器

在具有两个 sha1 密钥的 Play 商店中发布后,Google 登录无法正常工作

如何让 MVC RPC 风格的 API 控制器与多个 POST 方法一起工作

使用Python,OpenCV制作不同风格的素描图(正常,漫画,写实风格)

如何在 SwiftUI 的 ScrollView 中制作动画? SwiftUI 中的手风琴风格动画

重写为 MVC 后 GUI 无法正常工作