[关闭]
@1007477689 2020-07-30T09:40:24.000000Z 字数 2503 阅读 505

提高数据的颜值!一起看看Pandas中的那些Style

Python


英文原始网址:https://pbpython.com/styling-pandas.html


Pandasstyle 用法在大多数教程中见的比较少,它主要是用来美化 DataFrameSeries 的输出,能够更加直观地显示数据结果。

下面采用某商店的零售数据集,通过实际的应用场景,来介绍一下 style 中那些实用的方法。

首先导入相应的包(PandasNumpy)和数据集,并读取该数据集

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.read_excel('./data/sales.xlsx')
  4. df.head()

此处输入图片的描述

数据集中的特征有订单号、顾客姓名、商品名、数量、单价、金额以及对应的购买日期。

I. 输出格式化

style 中的 format() 函数可以对输出进行格式化,比如:在上述的数据集中,我们求每位顾客的消费平均金额 Mean 和总金额 Sum,同时,要求保留两位小数并显示相应的币种。

默认style渲染输出

  1. df.groupby('name')['ext price'].agg(['mean', 'sum']).head(n = 5)

此处输入图片的描述

设置特定style渲染输出

  1. (df.groupby('name')['ext price'].agg(['mean', 'sum']).head(n = 5).style.format(formatter = '${0:,.2f}'))

此处输入图片的描述

又或求每位顾客的总消费金额(保留2位小数)及其对应的占比情况(以百分数形式展现)

默认style渲染输出

  1. groupby_rule = pd.Grouper(key = 'date', freq = 'M')
  1. >>> TimeGrouper(key = 'date', freq = <MonthEnd>, axis = 0, sort = True, closed = 'right',
  2. label = 'right', how = 'mean', convention = 'e', base = 0)
  1. monthly_sales = df.groupby(by = groupby_rule)['ext price'].agg(['sum']).reset_index()
  2. monthly_sales['pct_of_total'] = monthly_sales['sum'] / df['ext price'].sum()
  3. monthly_sales

此处输入图片的描述

设置特定style渲染输出

  1. format_dict = {'sum': '${0:,.0f}',
  2. 'date': '{:%m-%Y}',
  3. 'pct_of_total': '{:.2%}'}
  4. # 针对不同列内容的格式化输出,我们可以才用字典形式进行注意设置
  5. monthly_sales.style.format(formatter = format_dict).hide_index()
  6. #.hide_index() 在某些场景下用于隐藏 DataFrame 中的 index 标签

此处输入图片的描述

II. 突出显示特殊值

style 还可以突出显示数据中的特殊值,比如高亮显示数据中的最大( highlight_max )、最小值( highlight_min )。

  1. #求每个月的销售总金额,并分别用红色、绿色高亮显示最大值和最小值
  2. (monthly_sales.style.format(formatter = format_dict)
  3. .hide_index()
  4. .highlight_max(color = 'lightgreen')
  5. .highlight_min(color = '#cd4f39'))

此处输入图片的描述

III. 色阶样式

运用 stylebackground_gradient 方法,还可以实现类似于 Excel 的条件格式中的显示色阶样式,用颜色深浅来直观表示数据大小。

  1. import seaborn as sns
  2. cm = sns.light_palette("green", as_cmap=True)
  3. (data.groupby(['姓名'])[['数量','金额']]
  4. .agg(['sum'])
  5. .head(5)
  6. .style
  7. .background_gradient(cmap=cm))

IV. 数据条样式

同样的,对于 Excel 的条件格式中的数据条样式,可以用 style 中的 bar 达到类似效果,通过颜色条的长短可以直观显示数值的大小。

  1. (monthly_sales.style
  2. .format(formatter = format_dict)
  3. .bar(color = '#FFA07A', vmin = 100_000, subset = ['sum'], align = 'zero')
  4. .bar(color = 'lightgreen', vmin = 0, subset = ['pct_of_total'], align = 'zero'))

V. 迷你图

最后介绍一个简单好用的骚操作——sparklines的运用,它能够以字符串的形式展现一个迷你的数据特征图。

假设我现在有一个这样的需求,就是想看看所有用户的购买数量和金额的大体分布情况。

按照往常的思路,可以用可视化的形式绘制出来,但是这样稍显复杂,使用sparklines则可以简单达到这种效果。

首先需要安装sparklines这个包

pip install sparklines
因为需求的实现需要用的groupby函数,所以先定义一个处理函数

from sparklines import sparklines

定义sparklines函数用于展现数据分布

def sparkline_str(x):
bins = np.histogram(x)[0]
sl = ''.join(sparklines(bins))
return sl

定义groupby之后的列名

sparkline_str.name = "分布图"

data.groupby('姓名')[['数量', '金额']].agg(['mean', sparkline_str])

这样一来,就比较清晰直观地展现了每个用户的消费数量分布和消费金额分布,进而可以根据这些特征对用户的消费行为进行进一步的研究。

sparklines的功能还是挺Cool挺实用的,更具体的用法可以去看看sparklines的文档。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注