我发现这个代码非常有趣。我稍微修改了代码以改善问题。本质上,该代码使用一个 DataFrame 使用
pd.style
来格式化另一个 DataFrame 的样式。
t1 = pd.DataFrame({'x':[300,200,700], 'y':[100,300,200]})
t2 = pd.DataFrame({'x':['A','B','C'], 'y':['C','B','D']})
def highlight_cell(val, props=''):
return props if val > 200 else ''
t2.style.apply(lambda x: t1.map(highlight_cell, props='background-color:yellow'), axis=None)
但是有人能解释一下最后一行是如何工作的吗?我找不到 Pandas 文档来阐明
df.map()
在另一个 df.apply()
中的行为。
对我来说,代码读起来就像 对于 t1 中的每个项目,立即将
highlight_cell()
应用于整个 t2,就像这个伪代码一样。
for x in all_items_in_t1:
yield [highlight_cell(y) for y in all_items_in_t2]
但是,输出表示 对于 t1 中的每个项目,仅将
highlight_cell()
应用于 t2 中与 t1 中该项目具有相同 (x, y) 位置的相应项目,如下所示。
for x, y in zip(all_items_in_t1, all_items_in_t2):
yield highlight_cell(y)
我仍然无法理解这种模式,因为它看起来有点令人困惑。谁能解释得更清楚一点吗
DataFrame.style.apply
,而不是DataFrame.apply
。
通过使用参数
axis=None
,可调用对象应用于整个DataFrame。由于可调用对象是 lambda,这本质上意味着我们运行:
t1.map(highlight_cell, props='background-color:yellow')
并使用输出作为格式。
x y
0 background-color:yellow
1 background-color:yellow
2 background-color:yellow