1. 简介
数据的处理的软件包有很多,在python中主要应用Pandas来进行处理。Pandas是一个十分成熟的数据处理包,熟练掌握可以高效并且方便地将数据进行转换和清洗,本节主要是pandas的一些基本技能和实用技巧。
数据科学家经常和表格形式的数据(比如.csv、.tsv、.xlsx)打交道。Pandas可以使用类似SQL的方式非常方便地加载、处理、分析这些表格形式的数据。
2. 数据结构
Series:用index和values分别规定索引和值。如果不规定索引,会自动创建 0 到 N-1 索引。
Series是pandas中暴露给我们使用的基本对象,它是由相同元素类型构成的一维数据结构,同时具有列表和字典的属性。
Series:有序,有索引
list: 有序,无索引
dict: 无序,有索引
DataFrame:表格型结构,含有一组有序的列,每一列可以是不同的数据类型。既有行索引,又有列索引。主要以列为操作对象。
3. 两种数据结构的创建
3.1 series
data = [1,2,3]
index = ['a', 'b', 'c']
s = pd.Series(data=data, index=index, name='sample')
# 对于s有如下四个属性
s.index
s.name
s.values # np的array对象
s.dtype # 元素类型
3.2 DataFrame
Series按列排列成的2D矩阵形式,是使用最多的对象。
data = [[1,2,3],
[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
df = pd.DataFrame(data=data, index = index, columns = columns)
其中:
df.index 是行索引
df.columns是列索引
df.values 是对应values
df.dtypes 是输出每列的元素类型
3.2.1. 从字典数据
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
pd.DataFrame(data, index=labels)
输出:
3.2.2. 从numpy数组
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=['a', 'b', 'c'])
df2
output:
3.2.3. 通过其他DataFrame
df3 = df2[['a','c']].copy()
df3
output:
3.2.4. 从csv文件pd.read_csv(filepath_or_buffer, sep=',', header='infer', names=None,index_col=None, encoding=None)
read_csv的参数很多,但这几个参数就够我们使用了:
- filepath_or_buffer:路径和文件名不要带中文,带中文容易报错;
- sep: csv文件数据的分隔符,默认是’,’,根据实际情况修改;
- header:如果有列名,那么这一项不用改;
- names:如果没有列名,那么必须设置header = None, names为需要传入的列名列表,不设置默认生成数值索引;
- index_col:list of (int or name),传入列名的列表或者列名的位置,选取这几列作为索引;
- encoding:根据你的文档编码来确定,如果有中文读取报错,试试encoding = ‘gbk’。
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv')
3.2.5. 从excel
pd.read_excel(io, sheetname=0, header=0, index_col=None, names=None)
read_excel的参数很多,但这几个参数就够我们使用了:
- header:如果有列名,那么这一项不用改;
- names:如果没有列名,那么必须设置header = None, names为列名的列表,不设置默认生成数值索引;
- index_col:同上。
4. 查改增删
4.1 查
series
- 直接使用
[]
下标查看,支持切片,和list,dict一样的操作。 -
.loc[]
这种方法和[]
相似,只不过它是基于索引index的 -
.iloc[]
与[]
一样,是基于位置的
DataFrame
第一种:[]
列操作:
-
[column_name]
注意[]中必须是列名
举例:df['A']
(单列索引,返回Series)df[['A', 'C']]
(列索引列表,返回DataFrame)
行操作:
取第一行:df[0:1]
第二种:.loc[]
基于索引
DataFrame的两维,每一维都和Series的.loc[]用法相同
举例:
第三种:.iloc[]
,基于位置
无视索引,只看位置,先行后列
- DataFrame 有两维,每一维都和 Series 的 .iloc[]用法相同;
- Series有四种方式,所以DataFrame有16种方式;
- 可以缺省后面维度,默认补全为 ‘:’ 。
4.2 改
series改值
直接在查的基础上复制就可以修改
使用函数修改的话:
Series.replace(to_replace=None, value=None, inplace=False)
- to_replace:要修改的值,可以为列表;
- value:改为的值,可以为列表,与to_repalce要匹配;
- inplace:是否在原地修改;
series改index
直接在index上改,注意不能用切片修改:s.index = ['新的index>','',...]
函数修改:
Series.rename(index=None, level=None, inplace=False)
- index:dict类型可以部分修改;
- level:多重索引时,可以指定修改哪一重,从0开始递增;
- inplace:是否原地修改。
举例:s1.rename(index = {'e':'b'}, inplace = False)
将原本的e改为b
DataFrame修改值
直接在查找后修改
或者使用函数:DataFrame.replace(to_replace=None, value=None, inplace=False)
- to_replace:要修改的值,可以为列表;
- value:改为的值,可以为列表,与to_repalce要匹配;
- inplace:是否在原地修改;
举例:df1.replace(to_replace=1, value=100, inplace=False)
DataFrame修改索引
直接在索引上改,索引类似于tuple,必须全改,不能切片修改。
使用函数修改:
DataFrame.rename(index=None, column =None, level=None, inplace=False)
- index:list or dict,list类型时必须长度相同,dict类型时可以部分修改;
- columns:list or dict,list时必须长度相同,dict时可以部分修改;
- level:多重索引时,可以指定修改哪一重,目前还用不着;
- inplace:是否原地修改。
4.3 增
series
增一行: s.loc[len(index)] = 100
增多行:Series.append(to_append, ignore_index=False, verify_integrity=False)
- to_append: 另一个series或多个Series构成的列表;
- ignore_index:False-保留原有索引,True-清除所有索引,生成默认数值索引;
- verify_integrity:True的情况下,如果to_append索引与当前索引有重复,则报错。
DataFrame增行
增一行:
增多行:
pd.concat(objs, axis=0)
尽量确保 列索引 相同,行增加。
- objs: list of DataFrame;
- axis: 取0,行增加操作。
df1 = pd.DataFrame([[22,33,44],[55,66,77]], index=['c','d'], columns=['A','B','C'])
pd.concat([df,df1], axis = 0 )
output:
DataFrame增列
增一列:
增多列:
pd.concat(objs, axis=1)
确保行索引相同,列增加
- objs: list of DataFrame;
- axis: 取1,列增加操作。
df1 = pd.DataFrame([[22,33],[44,55]], index=['a','b'],columns=['D','E'])
pd.concat([df,df1], axis =1)
4.4 删
series
Series.drop(labels, level=None, inplace=False)`
- labels:索引,单索引或索引的列表;
- level:多重索引需要设置;
- inplace:是否本地修改。默认False
DataFrame删多行
DataFrame.drop(labels, axis=0, level=None, inplace=False)
- labels:索引,单索引或索引的列表;
- axis:0,删行;
- level:多重索引需要指定;
- inplace:是否本地修改。
DataFrame删多列
DataFrame.drop(labels, axis=1, level=None, inplace=False)
- labels:索引,单索引或索引的列表;
- axis:1,删列;
- level:多重索引需要指定;
- inplace:是否本地修改。
5. 处理数据
5.1 处理NaN值
dropna(axis=, how=)
:丢弃NaN数据
axis==0是按行丢弃,1是按列丢弃
how: any 只要有NaN就丢弃,all 所有数据都为NaN时丢弃fillna(value=)
: 将NaN值设置为value的值isnull()
:对各元素进行判断是否为NaN,返回结果矩阵np.any(matrix)==value
: 判断matrix中是否有value值np.all(matrix)==value
: 判断matrix是否所有元素都为value
5.2 读取与导出
根据数据格式,pandas有多种方法.
read:
read_csv
read_table
read_fwf
read_clipboard
read_excel
-
read_hdf
…
write:
to_csv
to_table
to_clipboard
-
to_hdf
…
5.3 合并数据
concat
append
join
-
merge
(关系数据库用的最多的一个操作,单开一篇进行介绍link)