Pandas 是一个开源的强大的数据分析工具集,其基础是 Numpy,提供了高性能、易使用的数据结构和数据分析工具。Pandas 名字来自“panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。Pandas 可以从各种文件格式(如: CSV、SQL、Excel 等等)导入数据并对各种数据进行操作(如:运算、归并、筛选等等),非常适用于数据清洗和数据加工。在人工智能等领域,往往需要对原始数据集进行预处理,这时候pandas将是十分称手的工具。
工欲善其事,必先利其器,本文以及接下来的一系列文章将对pandas库进行一些常用方面的介绍,作为梳理性的学习小结。
首先介绍 pandas 的基本数据结构:Series 和 DateFrame 。其中,DataFrame 用来处理结构化数据(SQL数据表,Excel表格);Series 用来处理单列数据。可以把 DataFrame 看作由 Series 对象组成的字典或集合,Series 是一维的,表示 DataFrame 的一个列或者一个行。
创建 Series 对象通常用pandas.Series(data, index, dtype, name, copy=False, fastpath=False)
方法。
参数中,data是Series包含的数据,可以是一个列表、字典、array-like等;index是一个array-like或者一个Index对象,指定data的label,可以在创建Series对象或者DataFrame对象前先创建,若不指定则默认使用0、1、2……;dtype是data的数据类型;name是该Series的名字。示例如下:
import pandas as pd
series = pd.Series(['Wes McKinney','Male'], index = ['Name','Gender']) # 创建一个Series对象,index以一个列表形式传入
idx1 = pd.Index(['Name','Gender'], name='index1') # 先创建index,再传入下面的Series对象中
series = pd.Series(['Wes McKinney','Male'], index = idx1)
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每一列都可以是不同的值类型(数值、日期、object类型),同一列必须是相同的类型。其中object类型可以保存任何python对象。
创建 DataFrame 对象通常用pandas.DataFrame(data, index, columns, dtype, copy=False)
方法。
参数中,data可以是一个二维数组、字典或者DataFrame;index是一个Index或一维array-like对象,指定了行标签,默认使用0、1、2……;columns指定了列标签;dtype指定了data的数据类型。示例如下:
df = pd.DataFrame({'Name':['Tome','Bob'], 'Occupation':['Teacher','IT Engineer'], 'age':[28,36]}) # 从字典创建DataFrame,字典的keys就是DataFrame的columns列标签。
Pandas 支持从各种数据格式的文件中导入数据,创建DataFrame对象,比如:CSV、Excel、Json、pickle、html、feather、spss等等。当然,也可以把数据导出到文件中进行保存。这里简单介绍CSV文件和Excel文件。
CSV(逗号分隔值)是数据协作和共享的首选格式。在CSV文件中,对于每一行,各列采用逗号分隔。除了逗号,还可以使用其他类型的分隔符,比如TSV文件,使用制表符作为分隔符。导入数据方法是:pandas.read_csv()
,该方法有非常多的参数,常用的有filepath_or_buffer(csv文件的名字,可以带路径)、sep(分隔符,默认是逗号)、header(标题行)、names(给出了列名)、index_col(指定哪一列作为row labels)等。示例如下:
df_data = pd.read_csv('data/prizes.csv', index_col='id') # 从csv文件导入数据,指定了索引
df_data.to_csv('output/df_noindex.csv', sep=',', index=False) # 将数据导出到csv文件,sep指定了分隔符,index为False表示不保存索引
Excel 文件属于非常常见的数据文件了,读取Excel文件常用方法是:pandas.read_excel()
,该方法也有很多参数,主要用到的是Excel文件名和sheet_name数据表单名。需要注意的是:该方法需要用到第三方包 xlrd和xlwt,前者读excel,后者写excel。示例如下:
df_data = pd.read_excel('data/sci.xlsx', sheet_name='data1') # 从Excel文件导入数据
df_data.to_excel('output/df_noindex.xlsx', sheet_name='news1', index=False) # 导出数据
得到DataFrame或Series对象后就可以查看具体数据了,可以直接print打印显示出来,也可以使用DataFrame和Series对象的各种属性和方法进行查看,示例如下:
# 查看DataFrame对象基本属性
df.index # 查看所有行索引
df.columns # 查看所有列名,同df.keys()方法
df.dtypes # 查看各列数据类型
df.shape # 查看行列数量,返回一个元组
df.ndim # 查看数据维度
df.size # 查看数据总个数
df.empty # 查看数据是否为空,返回True或False
df.values # 返回一个同shape的数据元素也相同的numpy.ndarray数组
df.info() # 查看各列基本信息,如:列名、数据类型、行数量等
# 查看DataFrame的行数据
df[:2] # 查看前2行数据
df[1:5] # 查看第2到第5行,即下标为1到4。注意:不能用单个数字取单行!
df.loc['index'] # 查看单行数据,行名为'index'
df.loc[['index1','index2']] # 查看多行数据,行名为'index1'和'index2'
df.iloc[n] # 查看单行数据,下标为n
df.iloc[r1:r2] # 查看多行数据,行下标从r1到r2(不含)
df.head(n=5) # 查看前n(默认为5)行数据
df.tail(n=5) # 查看最后n(默认为5)行数据
df.sample(n, frac, replace=False, weights, random_state, axis=0)
# 随机查看n行或者数量占比为frac的行;replace为False表示不改变原df;axis=0表示对行采样。若axis=1则表示对列采样,随机查看列数据。
# 查看DataFrame的列数据
df.col # 查看单列数据,列名为col
df['col'] # 同上
df[['col1', 'col2']] # 查看多列数据,列名为'col1'和'col2'
df.iloc[:, c1:c2] # 查看多列数据,列下标从c1到c2(不含)
df.get(['col1', 'col2'], default=None) # 查看名为'col1'和'col2'列的数据,若不存在则返回default值
# 查看DataFrame的单个数据
df['col']['row'] # 查看行名为'row'列名为'col'的单个数据
df.at['row','col'] # 同上
df.loc['row','col'] # 同上
df['col'][-1] # 查看列名为'col'的最后一个数据
df.iat[n_r, n_c] # 查看行下标为n_r、列下标为n_c的单个数据
df.iloc[n_r, n_c] # 同上
# 查看DataFrame中满足特定条件的数据
df.query(expr, inplace=False, **kwargs) # 参数expr是个运算表达式字符串,即满足的特点条件,如:"label1 > 3 and label2 < 5"、"column1 == @var_c"等等。
# 参数inplace表示是否原地修改,默认是False,即返回一个符合条件的DataFrame或Series。
对应 Series 对象,它也有index、dtype、shape、ndim、size、values属性以及[ ]操作符和loc、iloc、at、iat、head、tail、get、sample方法,用法与DataFrame基本相同,但是它没有info和query方法。
以上。