[508]pandas之read_table、read_csv、read_excel、read_sql

本文详细介绍如何使用Pandas库进行各种数据格式的读取与写入操作,包括CSV、Excel、SQL数据库及MongoDB等,涵盖数据处理、筛选、排序及合并技巧。

read_table

Pandas读取txt表格

1.原始文本格式:空格分隔的txt,例如

2016-03-22 00:06:24.4463094 中文测试字符 
2016-03-22 00:06:32.4565680 需要编辑encoding 
2016-03-22 00:06:32.6835965 abc 
2016-03-22 00:06:32.8041945 egb

2.pandas 读取数据

import pandas as pd

data = pd.read_table('Z:/test.txt',header=None,encoding='gb2312',delim_whitespace=True,index_col=0)
#header=None:没有每列的column name,可以自己设定
#encoding='gb2312':其他编码中文显示错误
#delim_whitespace=True:用空格来分隔每行的数据
#index_col=0:设置第1列数据作为index

读取csv文件

  • test.csv
index,a_name,b_name
0,1,3
1,2,3
2,3,4
3,5

读csv文件

# -*- coding:utf-8 -*-
import pandas as pd

df = pd.read_csv('test.csv')
print(df)

输出

   index  a_name  b_name
0      0       1     3.0
1      1       2     3.0
2      2       3     4.0
3      3       5     NaN

读取excel

读取excel主要通过read_excel函数实现,除了pandas还需要安装第三方库xlrd。

pd.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None, 
    names=None,parse_cols=None, parse_dates=False, date_parser=None, na_values=None, 
    thousands=None, convert_float=True, has_index_names=None, converters=None, dtype=None, 
    true_values=None, false_values=None, engine=None, squeeze=False, **kwds)

该函数主要的参数为io、sheetname、header、names、encoding。

  • io:excel文件,可以是文件路径、文件网址、file-like对象、xlrd workbook;
  • sheet_name:返回指定的sheet,参数可以是字符串(sheet名)、整型(sheet索引)、list(元素为字符串和整型,返回字典{‘key’:‘sheet’})、None(返回字典,全部sheet);
  • header:指定数据表的表头,参数可以是int、list of ints,即为索引行数为表头;
  • names:返回指定name的列,参数为array-like对象。
  • encoding:关键字参数,指定以何种编码读取。

该函数返回pandas中的DataFrame或dict of DataFrame对象,利用DataFrame的相关操作即可读取相应的数据。

数据准备,有一个Excel文件:excel_output.xlsx有两个表单,表单名分别为:Python 以及student

#这个会直接默认读取到这个Excel的第一个表单
df=pd.read_excel('excel_output.xlsx')

#可以通过sheet_name来指定读取的表单
df = pd.read_excel('excel_output.xls',sheet_name='student')
#可以通过表单名同时指定多个
df=pd.read_excel('excel_output.xlsx',sheet_name=['python','student'])
#通过表单索引来指定要访问的表单,0表示第一个表单
df=pd.read_excel('excel_output.xlsx',sheet_name=0)
#也可以采用表单名和索引的双重方式来定位表单
df=pd.read_excel('excel_output.xlsx',sheet_name=['python',1])
#可以通过索引 同时指定多个
df=pd.read_excel('excel_output.xlsx',sheet_name=[1,2])

print(df.head())  #看看读取的数据,默认为前5行
data=df.values#获取所有的数据,注意这里不能用head()方法哦~
print("获取到所有的值:\n{0}".format(data))#格式化输出

# 获取行号
df.index.values
# 修改index
df.index = df.index + 1
# 获取列名
df.columns.values
# 获取指定列的值:
df['data'].values

del df['_id'] # 删除_id字段
df.sort_values(by='E') # 以某一列排序

# 选择需要显示的字段
data = df[['a', 'b', 'c','d','e']] # a,b,c 为字段列名 
# 读取指定的单行,0表示第一行,这里读取数据并不包含表头,要注意哦!
data=df.ix[0].values
#读取指定多行的话,就要在ix[]里面嵌套列表指定行数
data=df.ix[[1,2]].values
#读取指定的行列:读取第一行第二列的值,这里不需要嵌套列表
data=df.ix[1,2]
#读取指定的多行多列值:读取第一行第二行的title以及data列的值,这里需要嵌套列表
data=df.ix[[1,2],['title','data']].values
#获取所有行的指定列:读所有行的title以及data列的值,这里需要嵌套列表
data=df.ix[:,['title','data']].values

df = pd.read_excel('excel_output.xls',sheet_name=None)
print(df['2']) #指定sheet
xls_file=pd.ExcelFile('excel_output.xls')
print(xls_file.sheet_names)#显示出读入excel文件中的表名字

sheet1=xls_file.parse('2')
sheet2=xls_file.parse(0)
print('sheet1:',sheet1)
print('sheet2:',sheet2)
df=pd.read_excel('lemon.xlsx')
test_data=[]
for i in df.index.values:#获取行号的索引,并对其进行遍历:
    #根据i来获取每一行指定的数据 并利用to_dict转成字典
    row_data=df.ix[i,['case_id','module','title','http_method','url','data','expected']].to_dict()
    test_data.append(row_data)
print("最终获取到的数据是:{0}".format(test_data))

写入excel

excel的写入函数为pd.DataFrame.to_excel();必须是DataFrame写入excel, 即Write DataFrame to an excel sheet。

pd.to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='', float_format=None,columns=None, 
	header=True, index=True, index_label=None,startrow=0, startcol=0, engine=None, 
	merge_cells=True, encoding=None,inf_rep='inf', verbose=True, freeze_panes=None)
  • excel_writer:写入的目标excel文件,可以是文件路径、ExcelWriter对象;
  • sheet_name:表名
  • na_rep : 缺失值填充
    如果na_rep设置为bool值,则写入excel时改为0和1;也可以写入字符串或数字
    na_rep=True --> 1
    na_rep=False --> 0
    na_rep=3 --> 3
    na_rep=‘a’ --> ‘a’
  • columns :选择输出的的列存入
  • index:默认为True,显示index,当index=False 则不显示行索引(名字)
  • header :指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;若数据不含列名,则设定 header = None
  • index_label:设置索引列的列名
  • encoding:指定写入编码,string类型。

写入excel主要通过pandas构造DataFrame,调用to_excel方法实现。

'''一个excel写入1个sheet'''
df.to_excel('excel_output.xls',sheet_name='2',na_rep=True,
	columns=['index','b_name'],index=False)

'''一个excel写入多个sheet'''
writer = pd.ExcelWriter('output.xlsx')
# df1 = pd.DataFrame(data={'col1':[1,1], 'col2':[2,2]})
df1 = pd.DataFrame(data=[{'col1':1, 'col2':2},{'col1':3, 'col2':4}])
df1.to_excel(writer,sheet_name='Sheet1')
df1.to_excel(writer,sheet_name='2')
writer.save()
writer.close()
#-------------------------------------------------------
df1 = pd.DataFrame({'Data1': [1, 2, 3, 4, 5, 6, 7]})
df2 = pd.DataFrame({'Data2': [8, 9, 10, 11, 12, 13]})
df3 = pd.DataFrame({'Data3': [14, 15, 16, 17, 18]})
with pd.ExcelWriter('output2.xlsx') as writer:
    df1.to_excel(writer, sheet_name='Data1', startcol=0, index=False)
    df2.to_excel(writer, sheet_name='Data1', startcol=1, index=False)
    df3.to_excel(writer, sheet_name='Data3', index=False)

将一个EXCEL文件分割成多个文件

有时因为一个EXCEL文件的数据量很大,需要分割成多个文件进行处理。这时用Pandas的切片操作即可达到要求。

import pandas as pd
data = pd.read_excel('./public opinion.xlsx', sheetname='public opinion')

row_num, column_num = data.shape    #数据共有多少行,多少列
print('the sample number is %s and the column number is %s' % (row_num, column_num))
#这里我们的数据共有210000行,假设要让每个文件1万行数据,即分成21个文件
for i in range(0, 21):
    save_data = data.iloc[i*10000+1:(i+1)*10000+1, :] #每隔1万循环一次
    file_name= './public opinion' + str(i) + '.xlsx'
    save_data.to_excel(file_name, sheet_name = 'public opinion', index = False)

分割前的文件是这样

分割后的文件就有这么些了

将多个EXCEL文件合并成一个文件

分割的文件处理完了我们可能又要把它们合并在一起。这时可以用pandas的concat功能来实现。

import pandas as pd

data0 = pd.read_excel('./public opinion0.xlsx', sheetname='public opinion')
data1 = pd.read_excel('./public opinion1.xlsx', sheetname='public opinion')
data = pd.concat([data0, data1])

for i in range(2, 21):
    file_name = './public opinion' + str(i) + '.xlsx'
    data2 = pd.read_excel(file_name)
    data = pd.concat([data, data2])
data.to_excel('./public opinion-concat.xlsx', index = False)

这样就把所有的文件都合并在了一起。

read_sql

  • pandas.read_sql()
  • pandas.read_sql_query()
  • pandas.read_sql_table()

read_sql是综合了read_sql_table和read_sql_query的,所以一般用read_sql就好了

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

各参数意义:

  • sql:sql命令字符串
  • con:连接sql数据库的engine,一般可以用sqlalchemy或者pymysql之类的包建立;
  • index_col:选择某一列作为index;
  • coerce_float:将数字形式的字符串直接以float型读入;
  • parse_dates:将某一列日期型字符串转换为datetime型数据,与pd.to_datetime功能类似。可以直接提供需要转换的列名以默认的日期形式转换,也可以用字典的格式提供列名和转换的日期格式,比如{column_name: format string}(format string:“%Y:%m:%H:%M:%S”);
  • columns:要选取的列,一般没啥用,因为在sql命令里面一般就指定要选择的列了;
  • chunksize:如果提供了一个整数值,那么就会返回一个generator,每次输出的行数就是提供的值的大小。

设置参数con
1、用sqlalchemy构建数据库链接

import pandas as pd
import sqlalchemy
from sqlalchemy import create_engine
 
connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'
engine = create_engine(connect_info)
 
sql_cmd = 'SELECT * FROM table'
df = pd.read_sql(sql=sql_cmd, con=engine)
engine.close()  #使用完后记得关掉

2、用DBAPI构建数据库链接

import pandas as pd
import pymysql
 
conn = pymysql.connect(host=localhost, user=username, password=password, database=dbname, charset='utf8', use_unicode=True)
 
sql_cmd = 'SELECT * FROM table'
df = pd.read_sql(sql=sql_cmd, con=conn)
conn.close()  #使用完后记得关掉

在Pandas中直接加载MongoDB的数据

import pymongo
import pandas as pd

client = pymongo.MongoClient('localhost',27017)
db  = client['Lottery']
collection = db['Pk10']

data = pd.DataFrame(list(collection .find()))

#删除mongodb中的_id字段
del data['_id']

#选择需要显示的字段
data = data[['date','num1','num10']]
print(data)

参考:https://www.jb51.net/article/139147.htm
https://blog.youkuaiyun.com/brucewong0516/article/details/79097909
https://zhuanlan.zhihu.com/p/36031795
https://www.cnblogs.com/snaildev/archive/2018/04/22/8907952.html
https://www.cnblogs.com/liulinghua90/p/9935642.html
https://blog.youkuaiyun.com/Ghjkku/article/details/131364726

<think>我们正在讨论如何使用Pandasread_hdf方法进行数据读取,特别是在模型训练场景下的应用。根据引用[1][2][3][4],我们可以总结出read_hdf的使用方法以及一些注意事项。 首先,read_hdf是Pandas中用于读取HDF5格式文件的函数。HDF5是一种高效的数据存储格式,特别适合存储大型结构化数据,并且支持分块存储和压缩,因此在机器学习中处理大型数据集时非常有用。 使用步骤通常包括: 1. 将数据保存为HDF5格式(使用to_hdf方法,如引用[2]所示)。 2. 使用read_hdf读取数据。 在模型训练中,我们可能希望按批次读取数据以避免一次性加载整个数据集导致内存不足。read_hdf本身并不直接支持分批读取,但我们可以通过结合生成器或迭代器来实现。 下面是一个详细的使用指南: ### 1. 将数据保存为HDF5格式 在训练之前,我们需要将原始数据(如CSVExcel等)转换为HDF5格式。这样可以提高读取速度,并减少存储空间。 ```python import pandas as pd # 假设df是原始数据DataFrame df = pd.read_csv('large_dataset.csv') # 将DataFrame保存为HDF5文件 # 注意:key是HDF5文件内部的数据集标识符,mode='w'表示写入(如果文件存在则覆盖) df.to_hdf('dataset.h5', key='data', mode='w', format='fixed') # 或者使用format='table'以支持条件读取 ``` ### 2. 使用read_hdf读取整个数据集(适合小数据) 如果数据集不大,可以一次性读入内存: ```python import pandas as pd # 读取整个HDF5文件 df = pd.read_hdf('dataset.h5', key='data') ``` ### 3. 分批读取(适合大数据集) 对于大型数据集,我们可以使用`iterator`和`chunksize`参数进行分批读取。注意,这要求存储时使用`format='table'`(因为固定格式不支持分块读取)。 首先,保存数据时使用`format='table'`: ```python df.to_hdf('dataset.h5', key='data', mode='w', format='table') ``` 然后,分批读取: ```python # 创建一个迭代器,每次读取10000行 with pd.read_hdf('dataset.h5', key='data', chunksize=10000, mode='r') as store: for chunk in store: # 在这里处理每个数据块,例如用于模型训练 process_chunk(chunk) ``` ### 4. 读取部分列(特征选择) 在模型训练中,我们可能只需要部分特征。我们可以通过`columns`参数指定要读取的列: ```python # 只读取'feature1'和'feature2'列 df = pd.read_hdf('dataset.h5', key='data', columns=['feature1', 'feature2']) ``` ### 5. 读取部分行(条件查询) 如果存储时使用`format='table'`,我们还可以使用`where`参数进行条件查询,例如读取满足某些条件的行: ```python # 读取'age'大于30的所有行 df = pd.read_hdf('dataset.h5', key='data', where='age>30') ``` ### 6. 在模型训练中的应用 在训练模型时,我们可以将分批读取的数据用于训练。例如,使用Scikit-learn的增量学习(partial_fit): ```python from sklearn.linear_model import SGDClassifier import numpy as np # 初始化模型 model = SGDClassifier() # 分批读取并训练 with pd.read_hdf('dataset.h5', key='data', chunksize=1000, mode='r') as store: for i, chunk in enumerate(store): X_chunk = chunk.drop('target', axis=1) y_chunk = chunk['target'] # 部分拟合 model.partial_fit(X_chunk, y_chunk, classes=np.unique(y_chunk)) ``` ### 注意事项 - **存储格式选择**:`format='fixed'`(默认)格式读取速度快,但不支持条件查询和分批读取;`format='table'`支持条件查询和分批读取,但速度稍慢[^2]。 - **数据类型**:HDF5存储会保留数据类型,但要注意分类数据类型(category)可能需要在读取后重新转换。 - **内存管理**:使用分批读取时,确保每个分块的大小适合内存。 ### 性能优化 - **压缩**:在保存时使用`complib`和`complevel`参数进行压缩(例如`df.to_hdf(..., complib='blosc', complevel=9)`),可以减小文件大小,但可能会稍微增加读取时间。 - **索引**:对于条件查询,可以在存储时创建列索引(`data_columns=True`)以加速查询[^4]。 ### 总结 在模型训练中,使用`read_hdf`分批读取数据可以有效管理内存,尤其适用于大型数据集。关键步骤包括: 1. 将数据存储为HDF5格式(使用`format='table'`以支持分批和条件查询)。 2. 使用`chunksize`参数进行分批读取。 3. 结合机器学习库的增量学习功能进行训练。 --- §§相关问题§§ 1. 如何将多个DataFrame存储到同一个HDF5文件中? 2. 使用HDF5存储时,如何设置压缩以减少文件大小? 3. 在分批读取HDF5文件时,如何随机打乱数据顺序? 4. 除了HDF5,Pandas还支持哪些适合大型数据集的高效存储格式?</think>### Pandas `read_hdf()` 方法使用指南(模型训练场景) `read_hdf()` 是 Pandas 读取 HDF5 格式文件的核心方法,特别适合处理大型数据集和机器学习训练场景。以下是关键使用指南: --- #### 1. 基础读取方法 ```python import pandas as pd # 基本读取(需指定key参数) df = pd.read_hdf('dataset.h5', key='train_data') # key对应存储时的标识[^2] # 查看数据结构 print(f"数据集维度: {df.shape}") print(f"特征列: {df.columns[:-1]}") print(f"标签列: {df.columns[-1]}") ``` --- #### 2. 高效分批读取(内存优化) ```python # 创建分批读取迭代器 batch_size = 10000 with pd.HDFStore('dataset.h5', mode='r') as store: n_rows = store.get_storer('train_data').nrows for start in range(0, n_rows, batch_size): batch = store.select( 'train_data', start=start, stop=start+batch_size ) # 在此处进行模型训练 train_model(batch) ``` **优势**: - 内存占用恒定(与批次大小相关)$O(\text{batch\_size})$ - 支持TB级数据集处理[^1] --- #### 3. 选择性特征读取(优化I/O) ```python # 仅读取需要的特征列 features = ['age', 'income', 'education'] # 预选特征 df = pd.read_hdf( 'dataset.h5', key='train_data', columns=features + ['target'] # 必须包含标签列[^4] ) ``` --- #### 4. 条件过滤读取 ```python # 读取满足条件的数据子集 df = pd.read_hdf( 'dataset.h5', key='train_data', where='age > 30 & income < 100000' # 类似SQL的条件过滤[^1] ) ``` --- #### 5. 多文件联合读取 ```python # 读取多个HDF文件并合并 files = ['part1.h5', 'part2.h5', 'part3.h5'] dfs = [pd.read_hdf(f, key='data') for f in files] full_df = pd.concat(dfs, ignore_index=True) ``` --- #### 6. 性能优化参数 ```python df = pd.read_hdf( 'large_dataset.h5', key='data', chunksize=5000, # 分块读取大小 iterator=True, # 返回迭代器 lock=False, # 多线程时禁用锁 mode='r' # 只读模式加速访问[^4] ) ``` --- ### 模型训练集成示例 ```python from sklearn.ensemble import RandomForestClassifier def train_on_hdf(hdf_path, key): model = RandomForestClassifier(n_estimators=100) with pd.HDFStore(hdf_path) as store: # 获取总行数 n_rows = store.get_storer(key).nrows # 分批训练 for i in range(0, n_rows, 1000): batch = store.select(key, start=i, stop=i+1000) X = batch.iloc[:, :-1] y = batch.iloc[:, -1] model.fit(X, y) # 部分拟合 return model # 使用示例 trained_model = train_on_hdf('dataset.h5', 'train_data') ``` --- ### 最佳实践总结 1. **存储优化**: - 使用`to_hdf()`存储时指定`format='table'`以支持条件查询[^2] - 添加压缩:`df.to_hdf(..., complib='blosc', complevel=9)` 2. **读取优化**: - 优先使用`where`参数替代读后过滤 - 大文件务必使用`chunksize`或迭代器 - 仅读取必要列(`columns`参数) 3. **内存管理**: ```python # 监控内存使用 import psutil print(f"内存使用: {psutil.virtual_memory().percent}%") ``` 4. **格式选择**: | 格式 | 读取速度 | 条件查询 | 分批读取 | 适用场景 | |---|---|---|---|---| | HDF5 (fixed) | ⚡️ 最快 | ❌ 不支持 | ❌ 不支持 | 小型数据集 | | HDF5 (table) | ⚡ 快 | ✅ 支持 | ✅ 支持 | 大型数据集[^2] | | CSV | ⚠ 慢 | ❌ 不支持 | ⚠ 部分支持 | 兼容性需求 | > **关键原则**:当数据集超过内存50%时,必须使用分批读取策略[^1]。HDF5在$10^6$行以上数据比CSV快$3-5\times$[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值