Pandas数据预处理的常用函数
引入Pandas,用于有关数据处理和分析的环节。
一、读取数据文件
1 .读取excel数据文件
1.1加载Excel表,使用skiprows=1跳过首行【对于一个excel文件,首行一般为字段的定义(标题行),第二行才为数据】
并指定加载的列,注意数据文件的编码,默认utf-8,常用还有gb2312,根据自身数据而定。
%%timeit raw_pd = pd.read_excel(data_file,,skiprows=1,usecols=[1,2,4],name=['item_id','item_name','price'],encoding='gb2312') 181 ms ± 1.32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 这里可以为每个执行单元之前加入%%timeit,观察其耗时情况。
1.2加载Excel表,使用header=0跳过有列标题的首行
除了使用skiprows=1可跳过首行,header=0也可以实现同样效果【对比1.1】
raw_pd = pd.read_excel(data_file,header=0,usecols=[1,2,4],name=['item_id','item_name','price'],encoding='gb2312')
1.3加载Excel表,首行为数据,不是列标题
若该表第一行不是列标题行而是数据行,则需要指定header=None,否则读取后,第一行数据会被作为column name
raw_pd=pd.read_excel(data_file,usecols=[1,2,4],name=['item_id','item_name','price'],header=None,encoding='utf-8')
1.4加载Excel表,读取前n行数据
若数据文件大小为几个G,显然若直接全量读取,内存会挤爆,因此可以先读取前n行看看。使用nrows=500,表示只读取前500行。
raw_pd=pd.read_excel(data_file,usecols=[1,2,4],name=['item_id','item_name','price'],header=None, nrows=500,encoding='utf-8')
1.5加载Excel表,跳过所有空白行
若有些表出现了不定数量的空白行,可以使用skip_blank_lines=True处理
raw_pd=pd.read_excel(data_file,usecols=[1,2,4],name=['item_id','item_name','price'],header=None,skip_blank_lines = True, nrows=500,encoding='utf-8')
1.6加载Excel表,通过自定规则,跳过满足规则的行
例如跳过有值为单数的行,定义更复杂的函数,用于跳过满足复杂规则的行。不过,除非这些行很多,否则可以在读取后,直接用正则drop掉来得更有效
pd.read_csv(data_file, skiprows=lambda x: x % 2 != 0)
二、读取CSV文件
2.1读取csv文件跟读取Excel文件区别不大,这里简单给出示例
raw_pd=pd.read_csv(data_file,usecols=[1,2,4],name=['item_id','item_name','price'],header=None,nrows=500,encoding='gb2312')
2.2读取数据时,跳过尾行
raw_pd=pd.read_csv(data_file,usecols=[1,2,4],name=['item_id','item_name','price'],header=None, skipfooter=5,encoding='gb2312')
2.3读取特定分割符的数据文件
read_csv也可以读取任意文本文件,只需要指定列分割符。
raw_pd=pd.read_csv('data_file.txt',sep='||',encoding='utf-8')
三、使用c或者python作为读取文件的引擎
pd.read_*** 方法默认使用python解释器作为读取文件engine,若数据文件大,可选择c engine
engine : {'c', 'python'} Parser engine to use. The C engine is faster while the Python engine is currently more feature-complete.
四、使用迭代器读取超大文件
参考官网文档给出的示例,使用iterator=True
, 或者chunksize=4读取超大文件,返回的是TextFileReader,是一个文件迭代器
4.1.chunksize方式:
In [187]: reader = pd.read_csv('tmp.sv', sep='|', chunksize=4) In [188]: type(reader) Out[188]: <pandas.io.parsers.TextFileReader at 0x7f2b428c17f0> In [189]: for chunk in reader: .....: print(chunk)
4.2.iterator=True方式:
使用iterator=True方式,值读取前面5行,放回的也是df对象
In [190]: reader = pd.read_csv('tmp.sv', sep='|', iterator=True) In [191]: chunk_pd=reader.get_chunk(5) chunk_pd.head()
4.3.当然最佳的方式是两者结合使用:返回迭代器方式,并指定分块读取,例如分64k读取
iter_df=pd.read_csv(large_file,iterator=True,chunksize=64*1024)
五、查看数据的基本信息
raw_pd:表示从文件读出来的数据
raw_pd.head(5) # 查看数据基本信息(前5行) raw_pd.tail(5) # 查看末尾5行 raw_pd.sample(5) # 随机抽取5行查看 raw_pd.dtypes # 查看每列数据类型 raw_pd.columns #查看列名 raw_pd.info() #查看各字段的信息 raw_pd.shape #查看数据集行列分布,几行几列 raw_pd.describe() # 快速查看数据的基本统计信息
六、有关空值处理
空值:在pandas中的空值是""
缺失值:在dataframe中为NaN或者NaT(缺失时间),在series中为none或者nan
# 测试数据 raw_pd = pd.DataFrame({"name": ['aoo', 'boo', 'coo'], "college": [np.nan, 'SACT', 'AACT'], "birth_date": [pd.NaT, pd.Timestamp("2000-10-01"),pd.NaT]})
6.1行的空值处理
""" axis:0或者'index'代表行操作(默认) 1或者'column':列操作 how:any-只要有空值就删除(默认),all-全部为空值才删除 inplace:False-返回新的数据集(默认),True-在愿数据集上操作 """ # 使用频率高:查看name列中,有多少行为空值行,value_counts其实是一个统计方法 raw_pd['name'].isnull().value_counts() # 使用频率高:any表示行的任意一列有空值,则删除该行;all表示该行全部为空,则删除 raw_pd.dropna(axis=0, how='any', inplace=True) # 行的任意一列有空值,且出现2个空值才删除这些行。例如该行有3列,其中2列都是为空,那么可以删掉该行。 使用频率低:raw_pd.dropna(axis=0, how='any',thresh=2, inplace=True)
6.2列的空值处理
# 使用频率高:指定某几列,若这些列中出现了空值,则直接删除所在行 raw_pd.dropna(subset=['name', 'birth_date'],inplace=True)
6.3空值的填充
最简单的用法,对全部数据记录里面的空值填充指定值
df.fillna(value=‘bar’)
频繁使用:对指定列的空值进行填充
raw_pd['name']=raw_pd['name'].fillna(value='bar')
七、dataframe 取(定位)数据的操作
7.1按给定列名取数,类似字典操作:df[‘列名’]
raw_pd= raw_pd['name']
取出多列数据,入参为包含多个字段的list:[‘name’,‘college’]
raw_pd[['name','college']]
7.2按行默认的行索引号选取数据:df.loc
df = pd.DataFrame({"name": ['aoo', 'boo', 'coo'], "college": [np.nan, 'SACT', 'AACT'], "birth_date": [pd.NaT, pd.Timestamp("2000-10-01"),pd.NaT]}) # 查看该df的行索引 df.index RangeIndex(start=0, stop=3, step=1) # 打印 birth_date college name 0 NaT NaN aoo 1 2000-10-01 SACT boo 2 NaT AACT coo # 这里的0,1,2就是pandas默认给加载的数据提供的行索引号