02_数据读取与输出

数据读取

一些常见的数据格式读取和输出方法

格式文件格式读取函数写入(输出)函数
binaryexcelread_excelto_excel
textcsvread_csv/read_tableto_csv
textJSONread_jsonto_json
text网页HTML表格read_htmlto_html
text本地剪切板read_clipboardto_clipboard
SQLSQL查询数据read_sqlto_sql
textMarkdownto_markdown

读取CSV文件

read_csv函数的一个参数可以是文件路径(包括网络地址),或者二进制数据。

pd.read_csv(r'data\data.csv') # 本地相对路径
pd.read_csv(r'D:\dir\test.csv') # 绝对路径
pd.read_csv('https://xxxxx.com/file/data/cc.csv') # 网络数据

二进制格式的数据不常见

from io import StringIO,BytesIO
data=('col1,col2,col3\n'
     'a,b,1\n'
     'c,d,2')
pd.read_csv(StringIO(data))
pd.read_csv(BytesIO(data))
pd.read_csv(StringIO(data),dtype=object)

分割符

sep参数是字符型,代表每行数据内容的分隔符号,默认是逗号。

pd.read_csv(data,sep='\t') # 制表符分割
pd.read_csv(data,sep='|')  # | 分割
pd.read_csv(data,sep='(?<!a)\|(?!1)',engine='python') # 使用正则

表头

header参数支持整型和由整型组成的列表,指定第几行是表头,默认会自动推断把第一行作为表头

pd.read_csv(data,header=0) # 第一行做表头
pd.read_csv(data,header=None) # 没有表头
pd.read_csv(data,header=[0,1,3])  # 多层索引MultiIndex

如果skip_blank_lines=True,header参数将忽略空行和注释行,因此header=0表示第一行数据而非文本第一行。

列名

names用来指定列名的名称,一个类似列表的序列,与数据一一对应。如果文件不包含列名,那么应该设置header=None,列名列表中不允许有重复值

pd.read_csv(data,name=['列1','列2']) # 指定列名
pd.read_csv(data,name=['列1','列2'],header=None) # 指定列名

索引

index_col用来指定索引列,可以是行索引的列编号或者列名。Pandas不会自动将第一列作为索引,不指定时会自动使用以0开始的自然索引。

pd.read_csv(data,index_col=False) # 不再使用首列作为索引
pd.read_csv(data,index_col=0)     # 第几列是索引
pd.read_csv(data,index_col='年份') # 指定列名
pd.read_csv(data,index_col=['a','b']) # 多个索引
pd.read_csv(data,index_col=[0,3])     # 按列索引指定多个索引

使用部分列

可以使用 usercols 指定使用数据的哪些列

pd.read_csv(data,usecols=[0,4,3]) # 按索引只读取指定的列,与顺序无关
pd.read_csv(data,usecols=['列1','列2']) # 按列名,列名必须存在

返回序列(Series)

如果读取的数据只有一列,设置squeeze为True,则返回一个Series而不是DataFrame

pd.read_csv(data,usecols=[0],squeeze=True) # 会返回一个Series
pd.read_csv(data,usecols=[0,2],squeeze=True) # 会返回一个DataFrame,因为有两列

表头前缀

果原始数据没有列名,可以指定一个前缀加序数的名称,如n0、n1,通过prefix参数指定

pd.read_csv(data,prefix='c',header=None) # 表头为:c_0、c_1、c_2 ..

处理重复列名

mangle_dupe_clos参数为True时,如果有列名重复,解析列名将变为X,X.1,X.2,…,X.N。如果才参数为False,重复列的数据会被后面的列覆盖

pd.read_csv(data,mangle_dupe_cols=True)

列处理、真假转换

使用converters参数,对列的数据进行转换,参数中指定列名与针对列的处理函数,最终以字典的形式传人

def foo(p):
    return p+"s"
# 列名
pd.read_csv(data,converters={
    'x':foo,
    'y':lambda x:x*3
})
# 使用索引
pd.read_csv(data,converters={
    0:foo,
    1:lambda x:x*3
})

使用true_values和false_values将指定的文本内容转换为True或False,可以用列表指定多个值。

pd.read_csv(data,true_value=['Yes'],false_value=['No'])

### 跳过指定行

pd.read_csv(data,skiprows=2)  # 跳过前三行
pd.read_csv(data,skiprows=range(2)) # 跳过前三行
pd.read_csv(data,skiprows=[24,231,23]) # 跳过指定行
pd.read_csv(data,skiprows=np.array([2,6,11])) # 跳过指定行
pd.read_csv(data,skiprows=lambda x:x%2!=0) # 隔行跳
pa.read_csv(data,skipfooter=1) # 最后一行不加载

skip_blank_lines 指定是否跳过空行,如果为True,则跳过空行,否则数据记为NaN。

pd.read_csv(data,skip_blank_lines=False)

nrows参数用于指定需要读取的行数

pd.read_csv(data,nrows=1000) # 读取前1000行数据

空值替换

na_values 参数的值是一组用于替换NA/NaN的值。如果传参,需要指定特定的列的空值。使用na_values时经常会与keep_default_na 配合使用

pd.read_csv(data,na_values=[5]) # 5和5.0会被认为是NaN
pd.read_csv(data,na_values='?') # ?会被认为是NaNA
pd.read_csv(data,keep_default_na=False,na_values=[""]) # 空值为NaN
pd.read_csv(data,keep_default_na=False,na_values=["NA","0"]) # 符NA和字符0会被认为是NaN
pd.read_csv(data,na_values=["Nope"]) # Nope 会被认为NaN
pd.read_csv(data,na_values='abc') # a、b、c均被认为是NaN 等于na_values=['a','b','c']
pd.read_csv(data,na_values={'c':3,1:[2,5]}) # 指定列的指定值会被认为是NaN

日期时间解析

日期时间解析器参数date_parser用于解析日期的函数,默认使用dateutil.parser.parser来做转换。如果为某些或所有列启用了parse_dates,并且datetime字符串的格式都相同,则通过设置infer_datetime_format=True,可以大大提高解析速度,pandas将尝试推断datetime字符串的格式,然后使用更快的方法解析字符串。

# 解析时间的函数名,默认为None
# 指定时间解析库,默认是dateutil.parser.parser
date_parser = pd.io.date_converters.parser_date_time # 使用pd中的函数
date_parser = lambda x:pd.to_datetime(x,utc=True,format='%d%b%Y')
date_parser = lambda d:pd.datetime.strptime(d,'%d%b%Y')

pd.read_csv(data,parse_dates=['年份'],date_parser=date_parser) #parse_dates 指定哪些列进行时间日期解析
pd.read_csv(data,parse_dates=True) # 自动解析日期(pandas 自动推算)
pd.read_csv(data,parse_dates=['年份']) # 指定日期时间字段进行解析
pd.read_csv(data,parse_date={'时间':[1,4]}) # 将第1、4列合并解析成名为“时间”的时间类型

如果infer_datetime_format设定为True,且parse_dates可用,那么pandas将尝试转换为日期类型。

pd.read_csv(data,parse_dates=True,infer_datetime_format=True)

对于DD/MM格式的日期类型,如日期2020-01-06,如果dayfirst=True,则会转换成2020-06-01。

pd.read_csv(data,dayfirst=True,parse_dates=[0])

符号识别

千分位分隔符thousands,默认是None

pd.read_csv('test.csv',thousands=',') # 逗号分隔

小数点decimal,识别为小数点,默认是‘.’

pd.read_csv(data,decimal=',') 

行结束符lineterminator,将文件分成几行的字符,仅对C解释器有效

data = 'a,b,c~1,2,3~4,5,6'
pd.read_csv(StringIO(data),lineterminator='~',engine='c') # engine默认是None,可选值{'c','python'}

在csv模块中,数据可能会用引号等字符包裹起来,quoting参数用来控制识别字段的引号模式

  • 0或csv.QUOTE_MINIMAL:仅特殊字段有引号
  • 1或csv.QUOTE_ALL:所有字段都有引号
  • 2或csv.QUOTE_NONNUMERIC:所有非数字字段都有引号
  • 3或csv.QUOTE_NONE:所有字段都没有引号
import csv
pd.read_csv('input_file.csv',quoting=csv.QUOTE_NONE)

编码

encoding字段指定字符集,通常是指定为’utf-8’

pd.read_csv('gairuo.csv',encoding='utf8')
pd.read_csv('gairuo.csv',encoding='gb2312') 

读取Excel

pandas.read_excel 接口用于读取Excel格式的数据

语法

pd.read_excel(io,sheet_name=0,header=0,
             names=None,index_col=None,
             usecols=None,aqueeze=False,...)

文件内容

第一个参数可以出入本地文件或远程文件的URL

pd.read_excel('data/data.xlsx')  # 本地相对目录
pd.read_excel('data.xlsx')       # 如果问价与代码文件中在同一目录下
pd.read_excel('/user/wqw/data/data.xlsx') # 绝对路径
pd.read_excel('https://www.xxx.xxx.com/file/data/data.xlsx') # 使用URL

表格

sheet_name 可以指定Excel文件读取哪个sheet,如果不指定,默认读取第一个

pd.read_excel('tmp.xlsx',sheet_name=1) # 第二个sheet
pd.read_excel('tmp.xlsx',sheet_name='表1') # 第sheet名字读取

# 读取多个表,返回一个df组成的字典
dfs = pd.read_excel('tmp.xlsx',sheet_name=[0,1,'sheet5'])
dfs = pd.read_excel('tmp.xlsx',sheet_name=None) # 所有的sheet
df = dfs['Sheet5'] # 通过sheet名读取数据

表头、列名

数据的表头参数为header,如果不指定,默认第一行

pd.read_excel('tmp.xlsx',header=None) # 不设表头
pd.read_excel('tmp.xlsx',header=2) # 设置第三行为表头
pd.read_excel('tmp.xlsx',header=[0,1]) # 设置两层表头,多层索引

用names指定列名,也就是表头的名称,如果不指定,默认为表头的名称

pd.read_excel('tmp.xlsx',names=['姓名','年龄','成绩'])
pd.read_excel('tmp.xlsx',names=c_list) # 传入列表变量
pd.read_excel('tmp.xlsx',header=None,name=None) # 没有表头,需要设置为None

其他参数与pandas.read_csv的同名参数功能一致。

数据输出

csv

DataFrame.to_csv方法可以将DataFrame导出为CSV格式的文件

df.to_csv('done.csv')
df.to_csv('data/done.csv') # 指定目录
df.to_csv('data.csv',index = False) # 不要索引

可以使用sep参数指定分割符,columns传入一个序列指定列名,编码用encoding传入。如果不想要表头,可以将header设置为False。如果文件较大,可以使用compression进行压缩

compression_opts = dict(method='zip',
                       archive_name='out.csv')
df.to_csv('out.zip',index=False,compression=compression_opts)

Excel

DataFrame.to_excel方法可以将DataFrame导出为Excel格式的文件

df.to_excel('path_file.xlsx')  # 导出,指定文件路径
df.to_excel('path_file.xlsx',sheet_name='Sheet1',index=False) #指定sheet名,不要索引
df.to_excel('path_file.xlsx',index_label='label',merge_cells=False) # 指定索引名,不合并单元格

多个数据导出

with pd.ExcelWriter('path_file.xlsx') as writer:
    df1.to_excel(writer,sheet_name='sheet1')
    df2.to_excel(writer,sheet_name='sheet2')

html

DataFrame.to_html方法可以将DataFrame中的数据组装在HTML的table标签中。

print(df.to_html())
print(df.to_html(columns=[0])) # 输出指定列
print(df.to_html(bold_rows=False)) # 表头不加粗
print(df.to_html(classes=['class1','class2'])) # 表格指定样式,支持多个

SQL

将DataFrame中的数据保存到数据库的对应表中

# 需要安装SQLAlchemy
from sqlalchemy import create_engine

engine = create_engine('sqlite:///data/xx.db')
# 读取数据 read_sql_table
with engine.connect() as conn,conn.begine():
    data = pd.read_sql_table('data',conn)
# 读取数据 read_sql_query
data2 = pd.read_sql_query('select * from data',engine)

# 将数据写入数据库
data.to_sql('data',engine)
# 写入大量数据
data.to_sql('data_chunked',engine,chunksize=1000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值