上一篇文章 写的是处理GB级数据时datatable比pandas会更高效,但是datatable使用起来毕竟不如pandas来的顺手。所以今天准备介绍pandas的三个使用技巧来让我们的运行效率提高,以便处理较大体量的数据。
一、将数据分批次读取 csv格式是常见的数据存储方式,对于我们普通人而言易于读写。此外,在pandas中有pd.read_csv()函数可以将csv形式的数据进行读取。但当csv文件非常大的时候,直接读取会很吃内存,甚至会出现内存不够用的情况。
这时候我们可以 分批次(分块)读取,而不是一次性读取 这么大体量的数据。操作步骤:
-
分批次读取
-
处理每一批次
-
保存每一批次的结果
-
对所有的数据重复步骤1-3
-
将所有的批次结果都结合起来
pd.read_csv(chunksize) 中的chunksize指的的是每一批次的行数
import
pandas
as
pd
chunk_iterator
=
pd
.
read_csv
(
"largest_data.csv"
,
chunksize
=
10000
)
chunk_result_list
=
[]
#每一批次都是dataframe类型
for
chunk
in
chunk_iterator
:
#根据你的分析问题,设计自己的chunk_manipulate函数
filter_result
=
chunk_manipulate
(
chunk
)
chunk_result_list
.
append
(
filter_result
)
#合并所有批次处理结果,形成新的dataframe
df
=
pd
.
concat
(
chunk_result_list
)
二、剔除Na数据 有时候我们使用的数据中含有是Na,这时候剔除含有Na的数据会减少很多数据量。这里用到 df.dropna(how,thresh,subset)
-
how: "all"或者"any"。all当记录中的所有特征均为na,才剔除该条记录;any当记录中只要有na,该条记录就剔除
-
thresh: 整数型,每条记录中允许拥有的最大na数,当记录中na数超过thresh数后,剔除该条记录
-
subset:列名列表,选取某些特征进行na检测和处理
import
pandas
as
pd
use_cols
=
[
"stock_price"
,
"stock_volume"
,
"stock_symbol"
,
"dividend"
,
"eps"
]
ignore_cols
=
[
"stock_name"
,
"data_of_ipo"
]
#usecols使用的特征名
df
=
pd
.
read_csv
(
"large_data.csv"
,
usecols
=
use_cols
)
#剔除na数据
df
.
dropna
()
三、设置特征的数据类型 对于大多数数据科学家而言,并不需要设置特征的数据类型,但是当处理的数据极其庞大的时候,我们就不得不考虑设置特征的数据类型以降低内存开销。
例如在csv的特征列中,某一列特征是32bit浮点数类型,但32bit浮点太精确了,实际上我们仅仅使用16bit就够用了。pd.read_csv(dtype)可以设置列的数据类型
import
pandas
as
pd
import
numpy
as
np
#column_A 32bit
#column_B 16bit
df
=
pd
.
read_csv
(
"large_data.csv"
,
dtype
={
'column_A'
:
np
.
int32
,
'column_B'
:
np
.
float16
})