本节主要介绍pandas经常读取的两种数据格式,其分别是CSV和JSON本节使用两个数据集分别是2019腾讯算法大赛和中国AI创新创业大赛的数据集.
没有标签的原始数据的格式 带标题的数据格式
本节在介绍pandas读取CSV文件的时候,主要分成两个部分:
第一、读取小文件时应该要注意的几种情况,1、数据集中是否有标签信息。 2、读取指定列的数据 和行的数据记录、3原始数据集中没有列名的时候,如何为数据集增加列名
1、pandas读取数据时,默认会将第一行数据当做列名,所以如果原始数据中第一行不是列名的话,一定要将设置 header=None
import pandas as pd
without_label = False
if without_label:
# 读取没有标签的数据信息
without_label_csv = pd.read_csv('without_label.csv', header=None)
print("原始数据中的信息;\n", without_label_csv.head())
else:
without_label_csv = pd.read_csv('without_label.csv')
print("原始数据中的信息;\n", without_label_csv.head())
2、如果读取数据中的指定的列的数据,并且指定行数, 这个nrows决定行数、usecols决定列数
# 选择指定的列 并且读取前10行数据 ['Exporse', 'exporse_ad_id']
without_label_csv = pd.read_csv('have_label.csv', usecols=['Exporse'], nrows=10)
print("原始数据中的曝光量一列的值是:\n", without_label_csv)
3、原始数据没有列名,为数据增加列名操作,并且使用增加之后的列名进行索引操作
import pandas as pd
without_label_csv = pd.read_csv('without_label.csv', header=None, names=['Ad_id', 'Exporse'])
print("在原始数据中增加标签信息:\n", without_label_csv[0:10])
print('按照增加标签进行列索引操作:\n', without_label_csv['Ad_id'][0:10])
第二、简单说明一下下面代码使用的数据集大小是7G,本人电脑是32G的内存,如果直接读取也不会出现内存溢出的现象。所以其实并不清楚到底get_chunk()起没有起作用。 直接说明一下如何进行分块读取。
原始数据集中的信息
一直有个问题是即使读取数据的时候我们使用分块读取,但是在最后使用concat以及groupby()对数据进行分类的时候,我们任然要把所有的数据集加载到内存之后,但是为什么就不出现内存溢出的现象呢???
我感觉是concat()和groupby()有自己一套机制能够将中间结果提前存到硬盘上,节约内存空间,胡猜的没有依据。
介绍一下get_chunk()函数的特点:
第一: 当read_csv() 函数中增加 iterator=True这个参数时,数据返回的类型是一个空间地址而不是具体的值
第二: reader.get_chunk()函数得到具体数据的值
第三:最后使用pandas中的concat()函数将数据进行拼接即可,其实我也不是很明白pd.concat()的结果可以等价于dataframe类型。
import pandas as pd
import sys
# 为了方便显示数据集设置显示数据列距和列的个数
pd.set_option('display.max_columns', 20)
# Total_Exposure_Log_Data曝光数据大概7个多G 如果直接使用
direct_read = False
chunkSize = 5000000
if direct_read:
reader = pd.read_csv('../Dataset/dataset_for_train/New_Dataset/Total_Exposure_Log_Data.csv')
print("直接读取数据集时数据的描述:\n", reader.describe())
sys.exit()
else:
reader = pd.read_csv('../Dataset/dataset_for_train/New_Dataset/Total_Exposure_Log_Data.csv', iterator=True,
nrows=chunkSize*2)
print("使用iterator时数据的类型:\n", reader)
# 对数据进行分块保存
loop = True
chunks = []
while loop:
try:
# 每次读取5百万行数据
chunk = reader.get_chunk(chunkSize)
# print("分批读取数据时前10行数据是:", chunk[0:10])
chunks.append(chunk)
except StopIteration:
loop = False
print("Iteration is stopped.")
print("使用分块读取最后生成的list数据集是:\n", type(chunks[0]), chunks[0][0:5])
# df = pd.concat(chunks, ignore_index=True)
data_frame = pd.concat(chunks)
print("经过get_chunk函数处理的数据集", data_frame[0:5])
print("对生成的数据集进行分类操作:", data_frame.groupby(['Ad_material_size', 'Ad_bid']).count()[0:10])
第二部分pandas读取json文件:
使用read_json()函数的时候注意两点信息:
第一: 将lines设置为True 不然会出现 ValueError: Trailing data这个错误,不明白为什么这样做
第二: 数据集中出现中文数据时应该要注意编码信息,将encoding='utf-8'
import pandas as pd
data_json = pd.read_json('history-kg-all.json', lines=True, encoding='utf-8')
print("data_json中的数据类型:\n", type(data_json), data_json[0:10])