首页 > 解决方案 > 使用 Pandas 样式(DataFrame.style 属性)迭代产品价格

问题描述

我有一个 Pandas 数据框,其中包含在不同日期拍摄的各种产品的价格数据,列是“日期”、“产品”、“价格”。

我的目标是突出显示该特定产品降价的价格单元。很像下面看到的这个例子.csv…</p>

一个 .csv 示例,显示了我想要使用 Pandas 样式实现的目标

我知道每个产品都需要分开,然后成对评估该产品的价格。我在脚本的另一部分使用了以下代码来成功实现这一点:

integer = 0

for iteration in range(iterations):   

    first_price_pair = one_product.iloc[integer,2] 
    integer=integer+1
    second_price_pair = one_product.iloc[integer,2] 

# one_product is selected by using .drop_duplicates() on 'product'


price_dif = first_price_pair - second_price_pair                                

    if second_price_pair < first_price_pair:
        # highlight cell green - INDICATES PRICE REDUCTION FROM PREV PRICE                                
       
    elif second_price_pair == first_price_pair:         
        # no change to cell colour  
        
    elif second_price_pair > first_price_pair:
        # highlight cell RED - INDICATES PRICE INCREASE FROM PREV PRICE

我的问题是当我尝试使用 - DataFrame.style - 来应用突出显示时。似乎一旦对 DF 应用了“样式”,DF 就会转换为类型:pandas.io.formats.style.Styler - 然后就不能修改了。

如果有人可以确认可以实现我正在尝试做的事情,我将不胜感激,如果可以,请给我一些有关如何实现它的指导。

谢谢!

标签: pythonpandasdataframepandas-styles

解决方案


要应用突出显示,您可能需要使用以下任一方法:

Styler.applymap()
Styler.apply()

两者之间的区别在于您希望选择元素的方式,因为 applymap() 以元素方式工作,而 apply() 以列/行/表格方式工作。

这两种方法都需要一个函数来生成要更改的 CSS 属性。在你的情况下,如果你把它放在 if 语句中,它可能是这样的:

import pandas as pd
df = pd.DataFrame(np.random.randint(-4,4, size=(5,5)))
def background_cell(x, row_idx, col_idx, color):
    b_color = 'background-color: green'
    df_styler = pd.DataFrame('', index=x.index, columns=x.columns)
    df_styler.iloc[row_idx, col_idx] = b_color
    return df_styler

df.style.apply(background_cell, row_idx=1, col_idx=1, color='green', axis=None)

这将改变单元格 [1,1] 的背景。您可以使用不同的颜色和要更改的单元格的索引调用 df.style.apply() 。

我认为您通过键入 df = df.style.apply(...) 覆盖了 DataFrame 变量上的 Styler,这就是您丢失它并且无法再修改它的原因。样式是您可以用来显示 DataFrame 的一种方法,因此您应该在打印它时使用它,尽管它不是 DataFrame 本身的属性。


推荐阅读