python - 使用 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 - 然后就不能修改了。
如果有人可以确认可以实现我正在尝试做的事情,我将不胜感激,如果可以,请给我一些有关如何实现它的指导。
谢谢!
解决方案
要应用突出显示,您可能需要使用以下任一方法:
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 本身的属性。
推荐阅读
- python - 如何验证多个 wtform 字段一起满足条件
- css - 如何使用 css 和 angular7 动态显示文本省略号?
- java - 添加分数 (Java)
- php - cURL (PHP) 有问题
- javascript - 如何在选择选项上获取多个值并使用 ajax 在输入类型中显示?
- sql - SQL Server RTM version is not rounding up number
- go - 重写 goroutine 函数并恢复
- javascript - 如何调用函数来更改回调函数中的状态?
- javascript - 如何在 laravel 上显示 JSON 使用 vanilla js
- c++ - 在这种情况下,c++ 如何解析名称?