Pands导出excel

本文介绍使用Pandas导出Excel,并添加一些简单的格式

1 dataframe.to_excel导出Excel

df.to_excel(self,
     excel_writer,             # 输出路径
     sheet_name='Sheet1',      # 命名excel工作表名 
     na_rep='',                # 缺失值填充 ,可以设置为字符串,数字,字符串;使用bool则用0和1代替
     float_format=None,        #数值类型的格式设置,'%.2f'保留2位有效数字
     columns=None, # 选择输出的列,默认所有列。
     header=True,  # 是否将第一行作为表头,也可以传入list修改表头 
     index=True,   #是否输出index 默认为True,也可以传入int使用行号的值作为表头
     index_label=None,  # 设置索引列的列名
     startrow=0,    #开始的行
     startcol=0,    #开始的列
     engine=None,   #输出引擎,openpyxl”或“ xlsxwriter
     merge_cells=True,  #将MultiIndex和Hierarchical Rows写入合并的单元格
     encoding=None,     #编码,xlwt才需要
     inf_rep='inf',     #无穷大的值用什么表示 
     verbose=True,      #明细日志
     freeze_panes=None) #是否冻结,传入(row,col)     

在一个excel中写入多个sheet页,必须使用ExcelWriter:

with pd.ExcelWriter('output.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='Sheet_name_1')
    df2.to_excel(writer, sheet_name='Sheet_name_2')

2 使用pandas.io.format.style.Styler设置格式

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.io.formats.style.Styler.to_excel.html

使用DataFrame的style来配置单元格

2.1 隐藏索引

df.hide_index()

2.2 格式

Styler.format(self, formatter, subset=None, na_rep: Union[str, NoneType] = None)
formatter:表示需要转换的格式
subset:需要作用的列,默认为所有列,传入list
na_rep:替换缺失值,默认不替换

示例:

df = pd.DataFrame(np.random.randn(4, 2), columns=['a', 'b'])
df['c'] = ['a', 'b', 'c', 'd']

#保留2位有效数字,并使用百分比形式
# df.style.format("{:.2%}",subset=['a'])
#整数保留3位,小数保留2位
# df.style.format( '${3:,.2f}',subset=['b'])
#字符转大些
df.style.format("{:.2%}",subset=['c'])

也可以用dic来传入列及其对应的转换方式,实现同时对多个列操作

df.style.format({'c':str.upper,'a':"{:.2%}"})

2.3 单元格背景色

一般来说,设置背景色无疑是根据值的大小来判断而配色;或是直接将某列配色

2.3.1 使用applymap对每个元素配色

根据v值的情况来判断其配色
'background-color: green'表示绿色;'background-color: '表示无背景色;也可以使用16进制色号比如#BFE9C4。

data.style.applymap(lambda v: 'background-color: %s' % 'green' if v=='pm' else '' ,subset=['a'])

如果只想对某些列的某些行做操作,subset可以些为如下格式:

subset=pd.IndexSlice[2:5, ['B', 'D']]

2.3.2 使用apply对每一列配色

例子中传入的x表示一列,也就是一个series。

#判断v是不是一列x的最大的值
def highlight_max(x):
    return ['background-color: yellow' if v == x.max() else ''
                for v in x]
df.style.apply(highlight_max)

2.4 快捷配色标记

除了2.3中介绍的自定义的配色方法,styles模块也提供了几个针对特定值的快捷方法。

2.4.1 最大、最小值标记

有如下几个方法:
subset表示作用于哪些列;color表示颜色;axis=0表示列,=1表示1

#最大值
highlight_max(self, subset=None, color='yellow', axis=0)
#最小值
highlight_min(self, subset=None, color='yellow', axis=0)

示例:

df.highlight_max(color='lightgreen').highlight_min(color='red')

2.4.2 空值标记

#空值,空值是针对所有元素来使用的,无法设置行列
highlight_null(self,  color='red') 

2.4.2 渐变色标记

还有一个特殊的,根据某些值的大小关系为其添加渐变色背景

background_gradient(self, cmap='PuBu', low=0, high=0, axis=0, subset=None, text_color_threshold=0.408, vmin: Union[float, NoneType] = None, vmax: Union[float, NoneType] = None)

cmap表示渐变色系,其他色系可以参考这里

#示例
df.style.background_gradient(subset=['b'], cmap='BuGn')

2.4.3 选择器颜色标记[无法应用于Excel]

可以指定当鼠标选中时候的颜色显示

df.style.set_table_styles([{'selector': 'tr:hover','props': [('background-color', 'green')]}])

2.4.4 为其他无格式数据添加格式

#字体设置为败诉,对其方式为右对齐
df.style.set_properties(color="white", align="right")
#背景颜色为黄色
df.style.set_properties(**{'background-color': 'yellow'})

2.5 迷你条形图[无法应用于Excel]

使用的是style的bar函数

Styler.bar(self, subset=None, axis=0, color='#d65f5f', width=100,     align='left', vmin=None, vmax=None)
# align表示对齐方式,可以为left,mid,zero
# vmin表示基准值

2.6 其他

设置标题

df.style.`set_cation('title')

清理格式

df.style.clear

空值替换

df.style.set_na_rep('defualt')

隐藏某些列

df.style.hide_columns(['a','b'])

2.8 单元格样式

单元格样式包含很多,其实background-color就属于,其实我们可以使用apply或者applymap统一设置,方法可以看上文,这里不再赘述。内容分隔如下:

'background-color:green;color:red'

2.8.1 color 字体颜色

2.8.2 border-style:边框格式

none    定义无边框。
hidden  与 "none" 相同。不过应用于表时除外,对于表,hidden 用于解决边框冲突。
dotted  定义点状边框。在大多数浏览器中呈现为实线。
dashed  定义虚线。在大多数浏览器中呈现为实线。
solid   定义实线。
double  定义双线。双线的宽度等于 border-width 的值。

2.8.3 border-width:边框宽度

默认3px,设置为1px,导出excel是正常的框线。

2.8.4 border-color:边框颜色

默认black

2.8.5 text-align:文本水平对齐方式

left\right\center

2.8.6 font-style:字体样式

normal  默认值。浏览器显示一个标准的字体样式。
italic  浏览器会显示一个斜体的字体样式。
oblique 浏览器会显示一个倾斜的字体样式。

2.8.7 font-family:字体

2.9 导出为html

df.style.render
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266