有条件地格式化 Python 熊猫单元格
Posted
技术标签:
【中文标题】有条件地格式化 Python 熊猫单元格【英文标题】:Conditionally format Python pandas cell 【发布时间】:2017-05-03 09:43:19 【问题描述】:我正在尝试根据单元格的值对 Python pandas DataFrame 进行着色、突出显示或更改。例如如果每行上的单元格大于该行第一列中的单元格,则将该单元格突出显示为红色(或任何其他颜色),否则保持原样。
我在这里写了一个for循环:
for index in range(0, df.shape[0]):
for column in range(1, df.shape[1]): # from 1 not from 0 because I only need # to compare the 2nd to the last cell of each row with the 1st cell in the row
if df.iloc[index][column] - df_BDE_n_months_avg_std_pct.iloc[index][0] > 0:
then "PLEASE PUT YOUR HELP HERE, I NEED A PIECE OF CODE THAT CAN HIGHLIGHT THE CELL"
else:
"DO NOTHING"
到目前为止,我还没有找到方法。任何帮助都会很棒。
【问题讨论】:
【参考方案1】:来自the style docs:
您可以应用条件格式,即 DataFrame 取决于其中的数据,使用 DataFrame.style 属性。
import pandas as pd
df = pd.DataFrame([[2,3,1], [3,2,2], [2,4,4]], columns=list("ABC"))
df.style.apply(lambda x: ["background: red" if v > x.iloc[0] else "" for v in x], axis = 1)
编辑:要格式化特定单元格,您可以添加条件检查器以使用 Series.iteritems()
检查元素名称或使用 enumerate()
检查索引,例如如果要从第 3 列开始格式化,可以使用 enumerate 并检查索引:
df = pd.DataFrame([[2,3,-3], [3,2,7], [2,4,4]], columns=list("ABC"))
df.style.apply(lambda x: ["background-color: #ff33aa"
if (i >= 2 and (v > x.iloc[0] + x.iloc[1]
or v < x.iloc[0] - x.iloc[1]))
else "" for i, v in enumerate(x)], axis = 1)
【讨论】:
感谢 Psidom!你的解决方案很棒!一个附加问题,那么如果我想为每一行设置规则,从第 3 个单元格 x,如果 x > 第 1 个单元格 + 第 2 个单元格,或 x 您可以enumerate
每行并检查索引,仅当索引为 >=2 时才修改单元格。查看更新。
再次感谢 Psidom。我还没有玩过熊猫,你的建议非常宝贵。感谢您的宝贵时间:)
嗨 Psidom,一个非常相似的问题。您是否知道如何在 matplotlib 条形图中有条件地为上述情况着色?假设我想在条形图中绘制数据框,但我只想将“-3”和“7”涂成红色,其余的将是白色或黑色。
如何应用到整行,例如我的数据框中有一个名为 total 的行多次,我该如何实现【参考方案2】:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(4,3))
df.style.applymap(lambda x: 'background-color : yellow' if x>df.iloc[0,0] else '')
【讨论】:
以上是关于有条件地格式化 Python 熊猫单元格的主要内容,如果未能解决你的问题,请参考以下文章