一、需求背景
虽然pandas 会尽可能地将一个DataFrame 完整且漂亮地呈现出来,有时候你还是会想要改变预设的显示方式。这节列出一些常见的使用情境。
二、案例实战
2.1 完整显示所有列
有时候一个DataFrame 里头的栏位太多, pandas 会自动省略某些中间栏位以保持页面整洁:
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, 30))],axis=1)
df.iloc[3, 3] = np.nan
df.iloc[0, 2] = np.nan
但如果你无论如何都想要显示所有栏位以方便一次查看,可以透过pd.set_option函数来改变display.max_columns设定:
pd.set_option("display.max_columns", None)
df
另外你也可以使用T来转置(transpose)当前DataFrame,垂直显示所有栏位:
df.T.head (15)
此外,你可以在pandas官方文件里查看其他常用的显示设定
https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html#Building-Styles-Summary
2.2 减少显示的栏位长度
这边你一样可以通过pd.set_option函数来限制Titanic数据集里头Name栏位的显示长度:
from IPython.display import display
print("display.max_colwidth预设值:",pd.get_option("display.max_colwidth"))
#使用预设设定来显示DataFrame
df=pd.read_csv('https://bit.ly/kaggletrain')
display(df.head(3))
print("注意Name栏位的长度被改变了:")
#定制化显示
pd.set_option("display.max_colwidth",10)
df.head(3)
2.3 改变浮点数显示位数
除了栏位长度以外,你常常会想要改变浮点数(float)显示的小数点位数:
pd.set_option("display.precision",1)
df.head(3)
你会发现Fare栏位现在只显示小数点后一位的数值了。另外注意刚刚设定的max_colwidth是会被套用到所有DataFrame的。因此这个DataFrame的Name栏位显示的宽度还跟上个DataFrame相同:都被缩减了。
想要将所有调整过的设定初始化,可以执行:
pd.reset_option("all")
其他常用的options 包含:
max_rows
max_columns
date_yearfirst
等等。执行pd.describe_option()可以显示所有可供使用的options,但如果你是在Jupyter notebook内使用pandas的话,我推荐直接在set_option函式的括号里输入Shift+ tab显示所有选项。
2.4 为特定DataFrame加点样式
pd.set_option函数在你想要把某些显示设定套用到所有 DataFrames时很好用,不过很多时候你会想要让不同DataFrame有不同的显示设定或样式(styling)。
比方说针对下面这个只有10笔数据的DataFrame,你想要跟上一节一样把Fare栏位弄成只有小数点后一位,但又不想影响到其他DataFrame或是其他栏位:
#随机抽样10笔数据来做styling
df_sample=df.sample(n=10,random_state=9527).drop('Name',axis=1)
df_sample.Age.fillna(int(df.Age.mean()),inplace=True)
df_sample
这时候你可以使用pandas Styler底下的format函数来做到这件事情:
一个典型chain pandas函式的例子
df_sample.style.format('{:.1f}',subset='Fare').set_caption('五颜六色数据集').hide_index().bar('Age',vmin=0).
highlight_max('Survived').
background_gradient('Greens',subset='Fare').highlight_null()
如果你从来没有用过df.style,这应该是你这辈子看过最缤纷的DataFrame。
从上而下,上述代码对此DataFrame 做了以下styling:
(1)将Fare栏位的数值显示限制到小数后第一位
(2)添加一个标题辅助说明
(3)隐藏索引(注意最左边!)
(4)将Age栏位依数值大小画条状图
(5)将Survived最大的值highlight
(6)将Fare栏位依数值画绿色的colormap
(7)将整个DataFrame 的空值显示为红色
pd.DataFrame.style会回传一个Styler,你已经看到除了format函数以外,还有很多其他函数可以让你为DataFrame添加样式。使用format函数的最大好处是你不需要用像是round等函数去修改实际数值,而只是改变呈现结果而已。
熟悉styling技巧能让你不需画图就能轻松与他人分享简单的分析结果,也能凸显你想让他们关注的事物。「小提醒」:为了让你能一次掌握常用函数,我把能加的样式都加了,实际上你应该思考什么视觉样式是必要的,而不是盲目地添加样式。