看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 提供的表格样式功能可以让我们在 Jupyterlab 或者 Notebook 上将 DataFrame 数据表格样式化,如同在 Excel 进行颜色标记一样,让数据阅读起来更加高效,实现可视化。在本例中,我们将两数据进行合并,通过对比,来用样式标记它们的不同。
有两个如下的数据,构造为 DataFrame,分别为:
import pandas as pd
df_2022 = pd.DataFrame({'a': [*'xyz'], 'b': range(1, 10, 4)})
df_2023 = pd.DataFrame({'a': [*'xhz'], 'b': range(11, 20, 4)})
df_2022
'''
a b
0 x 1
1 y 5
2 z 9
'''
df_2023
'''
a b
0 x 11
1 h 15
2 z 19
'''
一份为 2022 年数据,一份为 2023 年数据,现需求为:
接下来我们分析需求,设计展示样式。
我们先将两个数据用 pd.concat() 合并起来,需要增加 keys 参数用于区分不同年份的数据,这样在观察起来更加方便。
然后增加个辅助列,这列代码按 a 分组后,所在组的所有年份,形成一个列表(或者元组)。再利用 style 对象的 apply 方法按列表情况设置样式。
最后,将辅助列删除。
先合并数据:
(
pd.concat([df_2022, df_2023], keys=['2022', '2023'], names=['year', 'idx'])
.reset_index()
)
'''
year idx a b
0 2022 0 x 1
1 2022 1 y 5
2 2022 2 z 9
3 2023 0 x 11
4 2023 1 h 15
5 2023 2 z 19
'''
增加辅助列:
(
pd.concat([df_2022, df_2023], keys=['2022', '2023'], names=['year', 'idx'])
.reset_index()
.assign(years=lambda x: x.groupby('a').year.transform(lambda y: [y.to_list()]*len(y)))
)
'''
year idx a b years
0 2022 0 x 1 [2022, 2023]
1 2022 1 y 5 [2022]
2 2022 2 z 9 [2022, 2023]
3 2023 0 x 11 [2022, 2023]
4 2023 1 h 15 [2023]
5 2023 2 z 19 [2022, 2023]
'''
增加样式,并删除辅助列,最终代码如下:
(
pd.concat([df_2022, df_2023], keys=['2022', '2023'], names=['year', 'idx'])
.reset_index()
.assign(years=lambda x: x.groupby('a').year.transform(lambda y: [y.to_list()]*len(y)))
.style
.apply(lambda x: ['color: red' if x.years == ['2022'] else '']*len(x), axis=1)
.apply(lambda x: ['background-color: #73BF00' if x.years == ['2023'] else '']*len(x), axis=1)
.hide('years', axis=1)
)
在 Jupyterlab 上的执行效果为:
这样就实现了需求。
(完)
更新时间:2024-08-18 16:12:51 标签:pandas python 样式