Python模块之Pandas 格式化数据

目录

一、style格式化数据

1、所有列格式化

2、指定列格式化

(1) 使用字典对指定列格式化

(2) 使用lambda对指定列格式化

(3) 使用 na_rep设置空值的显示

(4) 内置样式函数

3、用map()、applymap()结合自定义函数

4、隐藏索引hide_index或列hide_columns

5、当样式不取决于值时,使用set_properties 

二、用map()、applymap()结合format()格式化

1、保留2位小数

2、设置百分数

3、设置千位分隔符


一、style格式化数据

        需安装Jinja2:cmd>pip install Jinja2。

        在pandas style的官方文档中,有这样一句note,意思大致是这样的:style属性本身会返回object对象,这个对象内部有一个_repr_heml_方法,可以转为html语言,可以调用.render()方法,查看其html语言及css样式。
        css样式在程序里是可以被浏览器识别的,而jupyter notebook本身是运行在网页上的开发工具,所以这些样式是可以被jupyter notebook识别的。

所以,以下数据效果只能在Notebook中显示。

生成模拟数据

import pandas as pd
import numpy as np
np.random.seed(24)
df = pd.DataFrame({'A': np.linspace(1, 10, 10)})
df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=list('BCDE'))],
               axis=1)
df.iloc[3, 3] = np.nan
df.iloc[0, 2] = np.nan

1、所有列格式化

# 所有列格式化为2位小数,并转为百分数
df.style.format("{:.2%}")

2、指定列格式化

使用字典和lambda来格式特定列

(1) 使用字典对指定列格式化

# 用字典对指定列进行格式化
df.style.format({'B': "{:0<4.0f}", 'D': '{:+.2f}'})

# 用自定义字典对指定列进行格式化
format_dict = {'sum':'${0:,.0f}', '日期': '{:%Y-%m}', 'pct_of_total': '{:.2%}'}
(monthly_sales.style
              .format(format_dict)
              .highlight_max(color='#cd4f39')
              .highlight_min(color='lightgreen'))

(2) 使用lambda对指定列格式化

# 用lambda对指定列进行格式化
df.style.format({"B": lambda x: "±{:.2f}".format(abs(x))})

(3) 使用 na_rep设置空值的显示

df.style.format("{:.2%}", na_rep="空值")

(4) 内置样式函数

# 高亮最大值
df.style.highlight_max().format(None, na_rep="-")

# 高亮空值
df.style.highlight_null(null_color='red')

# 对B列取绝对值
df.style.format({'B': abs})

3、用map()、applymap()结合自定义函数

(1) 负数涂成红色,将正数涂成黑色

# 负数高亮显示
def color_negative_red(val):
    """
    Takes a scalar and returns a string with
    the css property `'color: red'` for negative
    strings, black otherwise.
    """
    color = 'red' if val < 0 else 'black'
    return 'color: %s' % color
df.style.applymap(color_negative_red)

# 最大值高亮显示
def highlight_max(s):
    is_max = s == s.max()
    return ['background-color: yellow' if v else '' for v in is_max]
df.style.applymap(color_negative_red).apply(highlight_max)

#map()方法根据提供的函数,对序列的值映射
#apply()方法根据提供的函数,按axis=0或1的方式对序列的值映射
#applymap()方法根据提供的函数,对所有元素的值映射

(2)  结合seaborn使用热力图

import seaborn as sns
cm=sns.light_palette('green',as_cmap=True)
s=df.style.background_gradient(cmap=cm)

(3) 条形图样式

df.style.bar(subset['A','B'],color='#d65f5f')

subset 参数控制作用的行列。

subset 传入的参数类似DataFrame的切片 

4、隐藏索引hide_index或列hide_columns

# 隐藏索引
df.style.hide_index()

#隐藏列
df.style.hide_columns(['C','D'])

5、当样式不取决于值时,使用set_properties 

df.style.set_properties(**{'background-color': 'black',
                           'color': 'lawngreen',
                           'border-color': 'white'})

参考链接:

pandas style格式化数据

Pandas Style 为数据表格美颜

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

二、用map()、applymap()结合format()格式化

需要重新赋值给df,写入excel时会保留格式。所以,这一方法更实用些。

- 对指定列格式化用map()

- 对所有元素格式化用applymap()

1、保留2位小数

#对'A'列进行设置
df['A']=df_decimal['A'].map(lambda x:('%.2f')%x)
#所有数字保留两位小数
df=df_decimal.applymap(lambda x:('%.2f')%x)

2、设置百分数

#对'A'列进行设置
df['A']=df_decimal['A'].map(lambda x:format(x,'.2%'))
#所有数字设置百分号(%)
df=df_decimal.applymap(lambda x:format(x,'.2%'))

#注意需要重新赋值给df

3、设置千位分隔符

#对'A'列进行设置(千位分隔符)
df['A']=df_int['A'].map(lambda x:format(x,','))
#对所有数据设置千位分隔符
df=df_int.applymap(lambda x: format(x,','))

参考文章:Pandas 实战系列:数字格式设置

你可能感兴趣的:(#,Python模块,python,开发语言,后端)