pandas:df创建、导出、文件读取、索引切片

使用环境:python3.7+win10+pandas:0.23.4,不同版本可能存在些许差异。

pandas数据读取、导出、切片

    • 1. 安装pandas包
    • 2. 导入pandas模块
    • 3. 数据读取
      • 3.1 read_table:读取txt文本文件
      • 3.2 read_excel:读取excel文件
      • 3.3 read_fwf:读取固定宽度文件
      • 3.4 read_sql:读取mysql
      • 3.5 read_pickle:读取二进制数据
      • 3.7 中文路径无法读取问题
      • 3.8 关于读取大文件的方法
    • 4. 数据导出
      • 4.1 to_sql:导出到mysql
      • 4.2 to_csv:导出为csv文件
      • 4.3 to_excel:导出为excel文件
      • 4.4 to_pickle:导出数据为二进制格式
    • 5. 创建DataFrame和Series
    • 6. 切片及记录抽取
      • 6.1 抽取前面或最后若干条记录
      • 6.2 显示索引和隐式索引

1. 安装pandas包

win+r,输入‘cmd’,在终端输入’pip3 install pandas’。


2. 导入pandas模块

import pandas as pd

3. 数据读取

文件路径使用问题:
1. 如果文件和数据源在同文件夹下,read第一个参数可以直接填写文件名字,如果不是填写数据完整路径,比如:r’d:\desktop\tt.txt’。
2. 文件路径:python的‘\’具有转义作用,输入路径时,如果不想使用‘\’,请字符串前加上r字母,代表原生字符串。或者也可以直接使用‘/’反斜杠。
3. 文件导出路径使用跟读取是一样的,python默认在当前文件工作目录下读写文件

3.1 read_table:读取txt文本文件

也可以用于读取csv文件,两者都是文本文件,一定程度上等同于read_csv(很多参数共用)
新版本pandas的可能不再支持read_table方法,使用read_csv即可;

df= pd.read_table('tt.txt',sep = ',',comment='#',encoding = 'gbk',skiprows=2,skipfooter=3,thousands='&',parse_dates={'birthday':[0,1,2]})

常用参数:
- sep:分隔符,默认为tab
- header:是否需要将原数据集中的第一行作为表头,默认将第一行用作字典名。
- names:如果原数据集中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头。
- index_col:指定原数据集中的某些列作为数据框的行索引。
- usecols:指定需要读取原数据集中的哪些变量名,以列表传入。
- dtype:读取数据时,可以为原数据的每个字典设置不同的数据类型。可以以字典表达。{‘a’: np.float64, ‘b’: np.int32}
- converters:通过字典格式,为数据集中的某些字段设置转化函数。{0:str}第一列转化为字符串
- skiprows:跳过开头行数
- skipfooter:跳过原始数据末尾行数。
- nrows:指定读取数据的行数;
- na_values:指定原数据集中哪些特征的值作为缺失值。
- skip_blank_lines:读取数据时是否需要跳过原数据集中的空白行,默认为True;
- parse_dates:如果参数为True,则尝试解析数据框的行索引;如果参数为列表,则尝试解析对应的日期列;如果参数为嵌套列表,则将某些列合并为日期列;如果参数为字典,则解析对应的列(字典中的值),并生成新的字段名(字典中的键);
- thousands:指定原始数据中的千位符;
- comment:指定注释符,在读取数据时,如果碰到首行指定的注释符,则跳过该行。
- encoding:如果文件中有中文,有时需要指定字符编码;
- skipinitialspace : boolean, default False;忽略分隔符后的空白(默认为False,即不忽略)
- na_filter : boolean, default True;是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False可以提升读取速度。
- nrows:限制读取多少行。
- error_bad_lines : boolean, default True;如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用)。
- chunksize:指定文件块的大小,分块读取。
- iterator:为True时,返回可迭代对象。

	reader = pd.read_table('tmp.sv', sep='\t', iterator=True)
	#通过get_chunk(size),返回一个size行的块#接着同样可以对df处理
	df=reader.get_chunk(10000)

逐块读取示例:

f = open(r'\train.csv','r')
reader = pd.read_csv(f, iterator=True, nrows=20000000)
loop = True
chunkSize = 100
chunks = []
while loop:
    try:
        chunk = reader.get_chunk(chunkSize)
        chunks.append(chunk)
     #停止迭代,数据读到尾部,结束循环。
    except StopIteration:
        loop = False
        print("文件读取完毕.")
'''使用concat合并数据块,ignore_index=True表示忽略原始索引,重建索引。'''
df = pd.concat(chunks, ignore_index=True)

3.2 read_excel:读取excel文件

add = pd.read_excel(f,usecols='f,g,u:ac',skiprows=1,skipfooter=1,encoding='utf_8',dtype={'日期':str})

常用参数
- sheetname:指定读取的第几个sheet,可以传递整数,也可以是具体的sheet表名字;
- header:第一行表头,默认需要。不需要header=None
- names:如果原始数据中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头;
- skip_rows:跳过开头行
- skip_footer:跳过结尾行数
- useclos:指定读取那些列,比如usecols=‘f,g,u:ac’
- encoding:编码格式
- index_col:指定列为行索引;比如指定第一列为索引,可以设置index_col=0,excel第一列没有列标题,默认是读成索引。
- parse_dates:同read_table;
- na_value:指定原始数据中哪些特殊值代表了缺失值;
- thousands:指定千位符
- convert_float:默认将所有的数值型字段转化为浮点型字段。
- converters:通过字典的形式,指定某些列需要转化的形式。

读取一个工作簿下多个sheet:ExcelFile类
读取一个工作簿下多个sheet,使用ExcelFile类,无须重复载入内存;

wb = pd.ExcelFile('path_to_file.xls')
sheet1 = wb.read_excel(wb,'sheetname1')
sheet2 = wb.read_excel(wb,'另外一个工作表名字')

# 也可以作为上下文管理器使用
with pd.ExcelFile('path_to_file.xls') as wb:
	sheet1 = wb.read_excel(wb,'sheetname1',
						  index_col=None,na_values=['NA'])

3.3 read_fwf:读取固定宽度文件

read_fwf(filepath_buffer,colspecs=’‘infer’,widths=None,kwds)

#使用widths参数
widths = [5,5,7,5]	#表示每一次取字符串的宽度,包括空格其他字符串长度在内。
df = pd.read_fwf(test_data,widths=widths,header=None,names=['col1','col2','col3','col4'])

#使用colspecs参数
colspecs = [(1, 7), (11, 21), (24, 34), (37, 44)]		#字段严格的位置,中间的位置不需要。
df = pd.read_fwf(test_data, colspecs=colspecs, header=None, index_col=None)

常用参数:
- widths:由整数组成的列表,选填,如果间隔是连续的,可以使用的字段宽度列表而不是‘colspecs’
- colspecs:一个元组列表,给出每行固定宽度字段的范围为半开区间(即[from,to [)),如[(1,3),(10,22),…]每个字段为半开区间即[int,int);字符串值’infer’可用于指示解析器尝试检测数据的前100行中的列规范,默认read_fwf尝试colspecs使用文件前100行来推断文件。只能在列对齐并且delimiter分隔符为空格(默认)情况下执行(default =‘infer’)。
其他很多参数同read_csv,详情可以输入help(pd.read_fwf)查看具体方法属性。

3.4 read_sql:读取mysql

需要安装pymysql模块,在终端执行‘pip3 install pymysql’即可。

import pymysql
import pandas as pd
# 创建数据库连接
# host:服务器地址,这里用的是本地mysql;user:用户名;password:mysql密码;database:数据库;port:端口号;charset:编码
connect = pymysql.connect(host='localhost',user = 'root',password='1234',database = 'yy',port = 3306,charset='utf8')
# 读取数据
user=pd.read_sql('select  from aa',connect)
# 描述性统计
user.describe

3.5 read_pickle:读取二进制数据

读取二进制数据,速度快,很多时候我们可以将一些数据保存为二进制数据文件。

frame = pd.read_pickle('frame_pickle')
  • 3.6 读取文件中编码格式问题
    有些时候由于编码问题,我们无法正常读取文件,这时候可以使用chardet模块识别文件内容编码,方法:chardet.detect
    安装:同样的,cmd终端:pip3 install chardet
import chardet
#先以二进制可读打开文件
with open('test.txt','rb') as f:
	chardet.detect(f.read())
#输出示例:这里提示编码GB2312,可信度99%,语言:中文;
#>>> {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

3.7 中文路径无法读取问题

版本问题,可能有些时候会出现带中文路径无法读取问题。
出错提示:OSError: Initializing from file failed

	#路径中带中文,直接读取报错了。
	df = pd.read_csv('d:/Desktop/身高信息.txt',sep=',')
	#先open打开文件,再向read方法里边传参,文件正常读取
	with open('d:/Desktop/身高信息.txt','r') as f:
		#用read_csv方法读txt文件,两者基本就是后缀名,分隔符差异,读取导出方法基本共用。
    	df = pd.read_csv(f,sep=',')

3.8 关于读取大文件的方法

  • 生成可迭代对象iterator=True,指定chunksize参数,逐块读取,处理后再拼接起来。
  • 指定dtype数据类型(不同类型占用空间不同)
  • 指定读取数据源的col(某些column可能我们不需要)

4. 数据导出

4.1 to_sql:导出到mysql

这里需要使用到sqlalchemy,还是一样cmd终端输入‘pip3 install sqlalchemy’安装该模块就好。

import numpy as np
import pandas as pd
from sqlalchemy import create_engine
df = pd.DataFrame(np.random.randint(3,20,(5,4)),columns=list('ABCD'))

#connect = pymysql.connect(host='localhost',user = 'root',password='123456',database = 'yy',port = 3306,charset='utf8')
#启动引擎,参数对照上面pymysql。
engine = create_engine('mysql://root:123456@localhost:3306/yy?charset=utf8')
df.to_sql(name='表名',con=engine,if_exists='replace',index=False,index_label=False)

#read_sql也可以使用sqlalchemy模块。
df1 = pd.read_sql('select  from 表名',engine)
# read_sql_table方法:使用id为索引读取Col_1,Col_2两列数据
df = pd.read_sql_table('data', engine,index_clo='id',columns=['Col_1', 'Col_2'])

4.2 to_csv:导出为csv文件

该方法也可以直接导出txt文件,txt同csv文件都是文本文件,很多地方使用方法是共通的。

#需要注意的一点是,导出csv文件,需要指定编码为'uft_8_sig,不然中文可能会乱码。'
df.to_csv(aa.csv,na_rep='NULL',sep = ',',index=False,header = False,encoding = 'utf_8_sig')	

一些参数:
- chunksize:int或者None,一次写入的行数。
- na_rep :空值填充;
- sep:分隔符
- index=False不保存索引。
- header=False不需要表头。
- columns:list指定要导出的列。
- encoding:编码格式

4.3 to_excel:导出为excel文件

#pandas读取或导出excel文件很慢,如果没有必要,尽量避免使用excel文件,如果只是便于excel以表格形式查看的话,也可以导出csv文件,office也可以打开。
df.to_excel('test.xlsx',encoding='utf_8',index=False)

4.4 to_pickle:导出数据为二进制格式

df.to_pickle("frame_pickle")

5. 创建DataFrame和Series

#我们可以通过向pd.Series传入列表,元组或者ndarray等创建Series
import pandas as pd
import numpy as np
#创建Series
nd = np.array((1,3,4))
s = pd.Series(nd,index=['张三','李四','王五'])
#或者我们也可以先不指定Series的索引index,直接对Series的index赋值。
s.index = ['张三','李四','王五']

#创建DataFrame
#通过传入字典创建DataFrame
df = pd.DataFrame({'姓名':['张三','李四','王五'],'成绩':[85,59,76]})
# 通过传入ndarray,再指定columns列索引创建
df = pd.DataFrame(np.array([['张三','85'],['李四','59'],['王五','76']]),columns=['姓名','成绩'])

6. 切片及记录抽取

6.1 抽取前面或最后若干条记录

#抽取前面5行数据,默认是前5条,也可以传入其他整数,比如前20条记录。
df.head()
df.head(20)

#抽取最后5,20条记录
df.tail()
df.tail(20)

6.2 显示索引和隐式索引

import pandas as pd
df = pd.DataFrame({'姓名':['张三','李四','王五'],'成绩':[85,59,76]})
#传入冒号‘:’,表示所有行或者列
#显示索引:loc,第一个参数为index切片,第二个为columns
df.loc[2]	#index为2的记录,这里是王五的成绩。
df.loc[:,'姓名']	#第一个参数为冒号,表示所有行,这里是筛选姓名这列记录。

#隐式索引:iloc(integer_location),只能传入整数。
df.iloc[:2,:]	#张三和李四的成绩,跟列表切片一样,冒号左闭右开。
df.iloc[:,'成绩']	#输入中文,这里就报错了,只能使用整数。

#也可以使用at定位到某个元素
df.at[index,columns]
df.at[1,'成绩']		#使用索引标签,李四的成绩
df.iat[1,1]  #类似于iloc使用隐式索引访问某个元素
	

你可能感兴趣的:(Python)