pandas透视数据写入之dataframe_to_rows()妙用

一、需求简介

在pandas中,pivot_table()函数可以创建透视表,即根据指定的行和列对数据进行重塑和汇总。
pivot_table()方法生成数据类型为dataframe,通常用df.to_excel()方法将透视数据写入Excel表中,但打开后发现数据在Excel呈现的不美观;首行和首列均会加粗、加上边框
需求:将透视数据写入Excel表后整体美观些,并可根据需求进行样式调整。
所需方法:dataframe_to_rows()

二、dataframe_to_rows()方法将数据写入Excel实现步骤

  1. pivot_table()方法生成统计数据
  2. openpyxl库创建一个Workbook对象
  3. 使用dataframe_to_rows()函数将统计数据逐行写入工作表中
  4. 保存为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')

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值