Python数据分析实战六:数据输出

60 阅读4分钟

在上一节(juejin.cn/post/727369… )中,我们介绍了不同数据集之间关联分析的方法,本节主要介绍如何将分析完成的数据以特定的格式输出,将分析完成之后的数据输出成想要的内容。

9.数据输出

9.1 输出到csv文件

用to_csv方法可以将pandas中的数据输出成一个csv文件,非常方便。

import pandas as pd

# 创建一个简单的数据框
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
        'Age': [20, 21, 19, 18],
        'Score': [90, 85, 88, 92]}

df = pd.DataFrame(data)

# 输出到CSV文件
df.to_csv('output.csv', index=False)

to_csv的一些常用的参数:

参数名描述
path_or_buf文件路径或对象。如果未提供,则结果会返回为字符串
sep字段间的分隔符,默认为','
na_rep缺失数据表示的字符串
float_format浮点数的格式字符串
columns要写入的列的顺序(列名的列表)
header是否写入列名
index是否写入行名(索引)
index_label索引的列标签。如果没有给出,并且header和index为True,则索引名称被用作或附加到列标题。如果一个序列被给出,那么索引名就是这个序列
mode写入文件的模式,你可以选择'w'或'a'等
encoding文件的编码格式,例如'utf-8'
compression表示压缩的字符串,允许的值是'gzip', 'bz2', 'zip', 'xz', None
line_terminator行结束符,默认为'\n'
chunksize写入文件时的行数
date_format日期格式的字符串
doublequote控制字段内引号的处理。当True时,双引号转义。当False时,字段结束
escapechar用于转义sep和quotechar的字符,当引用为QUOTE_NONE时有效

对于一些特殊类型的数据集,可以用上述的一些参数来规范输出的格式:

# 创建一个包含浮点数和日期的数据框
data = {'Values': [1.23456, 2.34567, 3.45678, 4.56789],
        'Dates': pd.date_range('2020-01-01', periods=4)}

df = pd.DataFrame(data)

# 输出到CSV文件,浮点数保留两位小数,日期格式为'YYYY-MM-DD',文件压缩为gzip格式,文件编码为'utf-8'
df.to_csv('output.csv', float_format='%.2f', date_format='%Y-%m-%d', compression='gzip', encoding='utf-8')

9.2 输出到excel文件

Pandas 提供了一些基础的 Excel 排版功能。要执行更复杂的排版任务,需要使用 openpyxl 或 xlsxwriter 这样的库。接下来以 xlsxwriter为例,介绍如何将计算好的数据输出到excel。

一个简单的示例:

import pandas as pd  
  
# 创建一个简单的数据帧  
data = {'Name': ['John', 'Anna', 'Peter', 'Linda'],  
'Age': [28, 24, 35, 32],  
'Rate': [0.34, 0.45, 0.31, 0.52]}
df = pd.DataFrame(data)  
  
# 将数据帧写入Excel文件  
writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')  
df.to_excel(writer, index=False, sheet_name='Sheet1')  
  
# 获取xlsxwriter对象  
workbook = writer.book  
worksheet = writer.sheets['Sheet1']  
  
# 关闭writer并保存文件  
writer.save()

可以得到如下表格:

1698853602(1).png

对于xlsxwriter而言,还可以定义表格的格式,具体方法是通过定义一个表格对象的Formatter来生成最后的表格,这里的格式和excel中的格式相对应,可以定义对齐方式,数字或者字体的格式,颜色等等,非常地灵活。以上面的数据集为例,把第二列和第三列的数字分别定义成保留一位小数和百分数的形式,可以在获取xlsxwriter对象之后加入下面的代码:

# 添加一些排版格式  
format1 = workbook.add_format({'num_format': '#,##0.00'}) # 数字格式  
format2 = workbook.add_format({'num_format': '0%'}) # 百分比格式 
# 第二个参数为列间距
worksheet.set_column('B:B', 18, format1) # 第二列设置为数字格式  
worksheet.set_column('C:C', 15, format2) # 第三列设置为百分比格式

除了定义formatter,还可以直接访问单元格,直接定义单元格的格式。

# 添加表头格式:加粗,居中对齐
header_format = workbook.add_format({
    'bold': True,
    'text_wrap': True,
    'align': 'center',
    'valign': 'vcenter',
    'border': 1})

# 写入表头并应用格式
for col_num, value in enumerate(df.columns.values):
    worksheet.write(0, col_num, value, header_format)

最终得到的效果如下:

1698854503(1).png

更多的Pandas输出到excel的例子,详见:xlsxwriter.readthedocs.io/pandas_exam…

9.3 输出到mysql

需要安装sqlalchemy库,这个例子创建了一个简单的DataFrame,然后将其写入到MySQL数据库中的一个表中:

import pandas as pd
from sqlalchemy import create_engine

# 创建一个DataFrame
data = {
    'Name': ['Tom', 'Nick', 'John', 'Tom'],
    'Age': [25, 26, 25, 23],
    'City': ['New York', 'London', 'New Delhi', 'Sydney']
}

df = pd.DataFrame(data)

# 创建SQLAlchemy引擎
# 格式:create_engine('mysql+driver://username:password@localhost/dbname')
engine = create_engine('mysql+mysqlconnector://user:password@localhost/mydatabase')

# 将DataFrame写入到MySQL数据库的表中
df.to_sql('my_table', con=engine, index=False, if_exists='replace')

在这个例子中,df.to_sql('my_table', con=engine, index=False, if_exists='replace')是写入MySQL的关键步骤。'my_table'是你想要写入的数据库表的名字,con=engine指定了连接数据库的引擎,index=False表示在输出的数据库表中不包含行索引,if_exists='replace'表示如果表已经存在,就替换掉原有的表。

注意:写入MySQL需要安装相应的数据库驱动,如mysqlconnector或pymysql。