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)

输出:

datax python3 处理数据_数据挖掘

3.2.2. 从numpy数组

df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=['a', 'b', 'c'])
df2

output:

datax python3 处理数据_数据_02

3.2.3. 通过其他DataFrame

df3 = df2[['a','c']].copy()
df3

output:

datax python3 处理数据_数据挖掘_03

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[]用法相同

举例:

datax python3 处理数据_数据_04


第三种:.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,必须全改,不能切片修改。

datax python3 处理数据_datax python3 处理数据_05


使用函数修改:

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增行

增一行:

datax python3 处理数据_数据挖掘_06


增多行:

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:

datax python3 处理数据_数据_07

DataFrame增列

增一列:

datax python3 处理数据_数据挖掘_08


增多列:

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)

datax python3 处理数据_数据_09

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)