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默认给加载的数据提供的行索引号

  

posted @ 2021-04-28 11:29  习久性成  阅读(725)  评论(0编辑  收藏  举报