第二章Pandas数据读取(Pandas精通之路)

Pandas精通之路

第一章 Python数据格式及使用介绍 第二章 Pandas-各类型文件数据读取 第三章 Pandas-数据的简单加工 第四章 Pandas-聚合与透视 第五章 Pandas-数据合并的多种方式 第六章 Pandas-数据的保存

提示:本系列重在介绍Pandas使用方法,未提供Anaconda、Pycharm等Python编辑器的安装方法。


简介

Pandas在数据清洗中的重要性不言而喻。本文将介绍以Pandas为核心的数据读取(不限于Pandas),Pandas其他功能可见本人《Pandas精通之路》系列其他文章。

一、Excel和csv文件读取

1)Excel数据读取

  1. pandas约定俗成的重命名为pd,最好不要乱改,代码易读非常重要。
  2. python\是转义,所以\\才是真实的\;可用/代替,/相当于\\。栗子:路径 C:\Users\Administrator\Desktop\test.xlsx,应该写成 C:\\Users\\Administrator\\Desktop\\test.xlsx,或者写成C:/Users/Administrator/Desktop/test.xlsx
  3. 读入的数据为DataFrame格式,操作4和5均可使用,csv数据库等其他文件数据读入后不再赘述此操作。 * type(data)可查看数据格式,pandas.core.frame.DataFrame即为DataFrame格式。
  4. head()tail()查看数据格式,括号中可写数字确定展示的行数
  5. 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数据读取

  1. sheet_name=None时读取表内所有数据
  2. 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数据读取

  1. pymysql 库连接数据库提取数据方便简洁,建议使用
  2. pandasread_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数据读取

  1. psycopg2 建立数据库连接
  2. 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   11  20220102   12  20220103   13  20220104   14  20220105   15  20220106   16  20220107   1

2.非表格数据(不限于txt)使用with open()方式读取,read()结果为strreadlines()结果为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解析为DataFramepandas官网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转换为DataFramepandas官网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数据的读取,基本是结合官网数据变形而来,主要在于读取(官网只介绍了转换)。

*声明:本文所载信息不保证准确性和完整性。文中所述内容和意见仅供参考,不构成实际商业建议,如有雷同纯属巧合。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值