首页 > 解决方案 > 在循环中同时设置pandas Dataframe中单元格的值和样式(颜色)

问题描述

我编写了一个 python 程序来查找和修复 Excel 电子表格中的语法错误。这部分有效。

如果单元格有可纠正的语法错误,则单元格中的值应该是固定的,并且单元格以黄色突出显示。

如果语法错误不可纠正(没有足够的信息来纠正它),则单元格的值应保持不变,但单元格应以红色突出显示。这是我似乎无法开始工作的部分。

我可以更新单元格的值或突出显示它,但我所有的尝试都失败了。

我使用过类似的命令

df.at[row,col] = value

更新单个单元格,这有效。和

def colorCell(df):
    color = 'background-color: red; font-weight: bold'

    dfTemp = pd.DataFrame("", index=df.index, columns=df.columns)

    for i in df[df["UserId"].str.match(userIdPat) != True]["UserId"].index:
        dfTemp.at[i,"UserId"] = color

    for i in df[df["Phone Number"].str.match(phonePat) != True]["Phone Number"].index:
        dfTemp.at[i,"Phone Number"] = color

    for i in df[df["MAC Address"].str.match(macPat) != True]["MAC Address"].index:
        dfTemp.at[i,"MAC Address"] = color

    return dfTemp

df2 = df.style.apply(colorCell, axis=None)

为单元格着色,但我似乎无法同时设置值和设置样式。

部分问题是我正在修改适当的值(df),同时我正在创建一个新的数据框来设置颜色(df2)。如果我将 df2 写回 df,下次尝试使用

df.at[row,col] = value

我确信有一个简单的解决方法,但我只是没有看到它。

谢谢!

标签: python-3.xpandasnumpy

解决方案


@user545424 感谢您建议我发布一个简短的示例。这样做我解决了我自己的问题。

我最初的问题是我必须分离数据框,一个用于数据,一个用于样式。在提出一个简短的例子时,我找到了一种用一个数据框做所有事情的方法(我对 python 和 pandas 都很陌生)。

我想出的解决方法是创建包含“.style”的原始数据框。

所以代替这个命令(我正在使用):

df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD'))

我现在使用以下命令创建 df:

df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD')).style

现在,当我想访问/更改 df 的数据部分时,我将其引用为“df.data”,而当我想应用 df 的样式部分时,我将其引用为“df.apply”。这样我就可以使用一个数据框访问数据和样式。这是我发现答案时正在编写的示例代码:

import numpy as np
import pandas as pd

def colorCell(df, row=None, column=None, color="red"):
    color = f"background-color: {color}; font-weight: bold"
    dfTemp = pd.DataFrame("", index=df.index, columns=df.columns)
    dfTemp.at[row,column] = color
    return dfTemp

# Create the dataframe including styles.
df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD')).style

# Update location [1,"A"] and set it to "red".
df.data.loc[1,"A"] = 999
df.apply(colorCell, row=1, column="A", color="red", axis=None)

# Update location [2,"B"] and set it to "yellow".
df.data.loc[2,"B"] = 999
df.apply(colorCell, row=2, column="B", color="yellow", axis=None)

正如我上面所说,我对 python 很陌生,对 pandas 甚至更陌生。所以仅仅因为上述工作,有没有更好的方法来做到这一点?

谢谢!


推荐阅读