一、需求简介
在pandas中,pivot_table()函数可以创建透视表,即根据指定的行和列对数据进行重塑和汇总。
pivot_table()方法生成数据类型为dataframe,通常用df.to_excel()方法将透视数据写入Excel表中,但打开后发现数据在Excel呈现的不美观;首行和首列均会加粗、加上边框
。
需求:将透视数据写入Excel表后整体美观些,并可根据需求进行样式调整。
所需方法:dataframe_to_rows()
二、dataframe_to_rows()方法将数据写入Excel实现步骤
- pivot_table()方法生成统计数据
- openpyxl库创建一个Workbook对象
- 使用dataframe_to_rows()函数将统计数据逐行写入工作表中
- 保存为Excel文件
三、实现代码
1、首先用Faker模块生成虚拟数据(也可自己编辑些测试数据):
2、其次实现代码如下
代码如下:
import time
from openpyxl import Workbook
import pandas as pd
from openpyxl.styles import Font, Color, PatternFill
from openpyxl.utils.dataframe import dataframe_to_rows
def DF_count():
'''读取表中数据,并进行数据透视,返回统计结果。'''
File_name = '数据.xlsx'
data = pd.read_excel(File_name)
# 提取月份,对第二列整体进行操作
data['月份'] = data['销售时间'].apply(lambda x :x[:3])
# 需求1:统计下每个月每种水果的销量
sale_values = data.pivot_table(values='销售数量',index='月份',columns='品种',aggfunc=sum)
return sale_values
def save_data(df1):
'''创建一个工作簿和工作表,并将数据写入、保存。'''
wb = Workbook()
ws = wb.active
for row in dataframe_to_rows(df1, index=True, header=True):
ws.append(row)
wb.save('result.xlsx')
def main():
df1 = DF_count()
save_data(df1)
if __name__ == '__main__':
main()
运行结果
四、表头调整
其实保存上图中的统计数据也可使用df.to_excel()方法,但该方法保存后默认表头和索引列均加粗且自带边框,整体不太美观。这里选择是dataframe_to_rows()进行数据保存,这里保存后”月份“字段单独占一行,于是再进行调整。
代码如下:
import time
from openpyxl import Workbook
import pandas as pd
from openpyxl.styles import Font, Color, PatternFill
from openpyxl.utils.dataframe import dataframe_to_rows
def DF_count():
'''读取表中数据,并进行数据透视,返回统计结果。'''
File_name = '数据.xlsx'
data = pd.read_excel(File_name)
# 提取月份,对第2列整体进行操作
data['月份'] = data['销售时间'].apply(lambda x :x[:3])
# 需求1:统计下每个月每种水果的销量
sale_values = data.pivot_table(values='销售数量',index='月份',columns='品种',aggfunc=sum)
return sale_values
def save_data(df1):
'''创建一个工作簿和工作表,并将数据写入、保存。'''
wb = Workbook()
ws = wb.active
# 以下三列为调整表头增加的代码,原理是插入1列,写入时列索引不写入。
index_head = df1.index
index_name = df1.index.name
df1.insert(loc=0, column=index_name, value=df1.index) #value为series数据类型
for row in dataframe_to_rows(df1, index=False, header=True):
ws.append(row)
wb.save('result.xlsx')
def main():
df1 = DF_count()
save_data(df1)
if __name__ == '__main__':
main()
运行结果
五、dataframe_to_rows用法介绍
语法:dataframe_to_rows(df, index=True, header=True)
含义:这个函数用于将数据帧转换为一个生成器,生成器会按行返回数据帧中的每个数据。
如果index为true,则将包含索引,从标题下面的一行开始。如果header为true,则从右边的一列开始将包含列标题。
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import pandas as pd
# 创建一个数据帧
data = {'Name': ['John', 'Amy', 'Peter'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)
print(type(df))
# 创建一个工作簿和工作表
wb = Workbook()
ws = wb.active
# 将数据帧转换为行并写入工作表
for row in dataframe_to_rows(df, index=False, header=True):
ws.append(row)
# 保存工作簿
wb.save('dataframe.xlsx')