Pandas精通之路
第一章 Python数据格式及使用介绍 第二章 Pandas-各类型文件数据读取 第三章 Pandas-数据的简单加工 第四章 Pandas-聚合与透视 第五章 Pandas-数据合并的多种方式 第六章 Pandas-数据的保存提示:本系列重在介绍Pandas使用方法,未提供Anaconda、Pycharm等Python编辑器的安装方法。
目录
简介
Pandas在数据清洗中的重要性不言而喻。本文将介绍以Pandas为核心的数据读取(不限于Pandas),Pandas其他功能可见本人《Pandas精通之路》系列其他文章。一、Excel和csv文件读取
1)Excel数据读取
pandas
约定俗成的重命名为pd
,最好不要乱改,代码易读非常重要。python
中\
是转义,所以\\
才是真实的\
;可用/
代替,/
相当于\\
。栗子:路径C:\Users\Administrator\Desktop\test.xlsx
,应该写成C:\\Users\\Administrator\\Desktop\\test.xlsx
,或者写成C:/Users/Administrator/Desktop/test.xlsx
- 读入的数据为DataFrame格式,操作4和5均可使用,csv数据库等其他文件数据读入后不再赘述此操作。 *
type(data)
可查看数据格式,pandas.core.frame.DataFrame
即为DataFrame格式。 head()
和tail()
查看数据格式,括号中可写数字确定展示的行数shape
查行列,describe()
查概况,info()
查数据类型和缺失
单sheet数据读取(多sheet默认读取第一个)
import pandas as pd
# path为excel文件路径,例如:`C:/Users/Administrator/Desktop/test.xlsx`
data = pd.read_excel(path)
# DataFrame数据质量预览 shape\ describe() \ info() 用法相同
data.tail(10)
# 例如返回(4, 2),即数据为4行2列
data.shape
多sheet数据读取
sheet_name=None
时读取表内所有数据OrderedDict
格式就是dict
字典格式,支持keys()
和values()
方式获取键值
# sheet_name=None读取的data格式为OrderedDict
data = pd.read_excel(path, sheet_name=None)
sheet_names = data.keys()
sheet_data = data.values()
(可跳过)补充用例1:不改变表1数据格式,将表2和表3数据汇总进表1
import pandas as pd
import openpyxl as op
# 文件路径列表
path = ['表1', '表2' ,'表3'] # 可通过os.listdir()获取文件并生成这个list
# 设置步长:每个表格有多少行,用于to_excel保存
step = 4
# 导入文件
book = op.load_workbook(path[0])
# 建立保存的excel
writer = pd.ExcelWriter(path[0], engine='openpyxl')
# 赋给当前的writer
writer.book = book
# 限制sheet_name,并确保数据插入指定sheet
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
# 取第一个sheet_name,数据会保存在此sheet
sheet = book.worksheets[0]
row_mc_str = sheet.max_row
for fn in file[1:]:
data = pd.read_excel(fn, index_col=0)
data.to_excel(writer, sheet_name=sheet.title, startrow=row)
row += step
writer.save()
writer.close()
2)csv数据读取
# csv读取报错时可以加上engine参数(90%概率因为这个参数)
data = pd.read_csv(path, engine='python')
# 中文字符乱码可加encoding
data = pd.read_csv(path, engine='python', encoding='utf-8')
# 设置'时间'列为时间索引列
dateparse = lambda dates: pandas.datetime.strptime(dates, '%Y%m%d')
data = pandas.read_csv(
'./data.csv',
parse_dates=['时间'],
date_parser=dateparse,
index_col='时间'
)
二、数据库文件读取
1)MySQL数据读取
pymysql
库连接数据库提取数据方便简洁,建议使用pandas
的read_sql()
提取数据
import pymysql
import pandas as pd
# 输入数据库密码
password = input('请输入密码:')
# 建立连接,注意参数不正确会导致连接失败
conn = pymysql.connect(host='localhost',user='root',passwd=password ,db='test',port=3306,charset='utf8')
# sql语句,“”“”“”的格式可以保证sql语句执行正确
sql_cmd = """
select * from table where city='迪拜'
"""
# 数据获取,DataFrame格式
data = pd.read_sql(sql_cmd,conn)
2)Postgres数据读取
psycopg2
建立数据库连接pd.DataFrame()
数据转换为DataFrame,无pandas
可不转,数据已提取可以直接使用
import psycopg2
# 创建连接对象
conn = psycopg2.connect(
database="postgres",
user="postgres",
password="pd", # 密码
host="localhost",
port="5432")
conn.set_client_encoding("utf-8")
# 创建指针对象
cur = conn.cursor()
# 获取结果
cur.execute("""%s""" % sql)
result = cur.fetchall()
# 关闭连接
conn.commit()
cur.close()
conn.close()
# 转换数据为DataFrame格式
result = pd.DataFrame(result)
3)其他类型数据库
大同小异,核心都是找到对应的数据读取包,不再一一举例
三、txt、dat和json等文件读取
1)txt、sql、del等文件读取
1.规整的表格数据,可通过pd.read_csv
方法读取为DataFrame
格式数据;其中header=None
是无列名称,否则会将第一行作为列名称,names
是指定的列名,sep
是分割符,默认为逗号,具体视实际数据分割方式而定。
import pandas as pd
data = pd.read_csv('数据.txt',
header=None,
names=['日期', '分类', '类型'],
sep=' '
)
print(data)
输出结果示例
日期 分类 类型
0 20220101 1 大
1 20220102 1 中
2 20220103 1 大
3 20220104 1 大
4 20220105 1 小
5 20220106 1 大
6 20220107 1 小
2.非表格数据(不限于txt)使用with open()
方式读取,read()
结果为str
,readlines()
结果为list
with open("data.txt", encoding='utf-8') as f:
data = f.read()
print(type(data))
print(data)
输出结果
<class 'str'>
20220101,1,大
20220102,1,中
20220103,1,大
20220104,1,大
20220105,1,小
20220106,1,大
20220107,1,小
sql文件读取
with open("data.sql", encoding='utf-8') as f:
data = f.readlines()
print(type(data))
for d in data:
print(d)
输出结果
<class 'list'>
create table dark
(
....
)
distributed by ()
partition by range(dt)
(
START ('2010-01-01'::date) END ('2041-12-31'::date) EVERY ('1 mon'::interval)
)
;
3.del等其他类型文件方法基本相同,不一一列举
2)dat文件读取
1.表格类数据pd.read_table()
方法读取;
2.非表格数据with open()
同txt文件,不赘述。
import pandas as pd
# 读取文件名为file_nm.dat的文件,分隔符为|@|,无头
data = pd.read_table('file_nm.dat', sep='\|@\|', header=None)
# 生成DataFrame数据
data.tail(10)
3)json数据读取
1.pd.read_json()
将标准的json
解析为DataFrame
。pandas官网read_json方法
import pandas as pd
# orient参数一般为table、records、split,不理解尝试使用即可
data = pd.read_json('data.json', orient='table')
print(data)
print(type(data))
原json格式数据
{
"schema": {
"fields": [{
"name": "index",
"type": "integer"
}, {
"name": "col 1",
"type": "string"
}, {
"name": "col 2",
"type": "string"
}],
"primaryKey": ["index"],
"pandas_version": "0.20.0"
},
"data": [{
"index": 0,
"col 1": "a",
"col 2": "b"
}, {
"index": 1,
"col 1": "c",
"col 2": "d"
}]
}
输出结果
col 1 col 2
0 a b
1 c d
<class 'pandas.core.frame.DataFrame'>
2.半结构化json,pd.json_normalize
转换为DataFrame
。pandas官网json_normalize方法
import pandas as pd
import json
# 读取data.json文件
with open('data.json', encoding='utf-8') as f:
data = f.read()
# json字符串解码成python对象dict
data = json.loads(data)
# data = [
# {
# "id": 1,
# "name": "Cole Volk",
# "fitness": {"height": 130, "weight": 60}
# },
# {"name": "Mark Reg", "fitness": {"height": 130, "weight": 60}},
# {
# "id": 2,
# "name": "Faye Raker",
# "fitness": {"height": 130, "weight": 60}
# }
# ]
df = pd.json_normalize(data)
print(df)
输出结果
id name fitness.height fitness.weight
0 1.0 Cole Volk 130 60
1 NaN Mark Reg 130 60
2 2.0 Faye Raker 130 60
3.(比官网增加个难度的json)复杂json的展平操作
import pandas as pd
import json
# 读取data.json文件
with open('data.json', encoding='utf-8') as f:
data = f.read()
# json字符串解码成python对象dict
data = json.loads(data)
# data =
# {
# "result": [{
# "state": "Florida",
# "shortname": "FL",
# "info": {
# "governor": "Rick Scott"
# },
# "counties": [{
# "name": "Dade",
# "population": 12345
# },
# {
# "name": "Broward",
# "population": 40000
# },
# {
# "name": "Palm Beach",
# "population": 60000
# }
# ]
# },
# {
# "state": "Ohio",
# "shortname": "OH",
# "info": {
# "governor": "John Kasich"
# },
# "counties": [{
# "name": "Summit",
# "population": 1234
# },
# {
# "name": "Cuyahoga",
# "population": 1337
# }
# ]
# }
# ]
# }
df = pd.json_normalize(
data,
# record_path为对象指向路径,即result下的counties路径
record_path=['result', 'counties'],
# meta用作结果表中数据的字段
meta=[['result', 'state'],
['result', "shortname"],
['result', 'info', 'governor']],
# 字段连接符,即['result', 'state']结果为result_state
sep='_'
)
# 重命名字段
df.rename(columns={
'result_state': 'state',
'result_shortname': 'shortname',
'result_info_governor': 'info_governor'
}, inplace=True
)
输出结果
name population state shortname info_governor
0 Dade 12345 Florida FL Rick Scott
1 Broward 40000 Florida FL Rick Scott
2 Palm Beach 60000 Florida FL Rick Scott
3 Summit 1234 Ohio OH John Kasich
4 Cuyahoga 1337 Ohio OH John Kasich
总结
本文介绍了pandas读取各类文件数据的方法,其中最为常用的是Excel、csv和DataBase数据的读取;另外也介绍了txt、dat、sql等类型数据的读取,方法大同小异;最后结束了json数据的读取,基本是结合官网数据变形而来,主要在于读取(官网只介绍了转换)。
*声明:本文所载信息不保证准确性和完整性。文中所述内容和意见仅供参考,不构成实际商业建议,如有雷同纯属巧合。