Pandas入门第二章之数据的读取

  • Post author:
  • Post category:其他


本节主要介绍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])