Pandas


Pandas的数据结构


pandas 中使用Series和DataFrame对象存储数据

Series

1.什么是Series

        Series是一种类似与一维数组的对象,由下面两个部分组成:

                values:一组数据(ndarray类型)

                index:相关的数据索引标签

2.如何创建Series

(1) 由列表或numpy数组创建

默认索引为0到N-1的整数型索引

可以通过设置index参数指定索引

Pandas_第1张图片

特别地,由ndarray创建的是引用,而不是副本。对Series元素的改变也会改变原来的ndarray对象中的元素。(列表没有这种情况)

(2) 由字典创建

3.Series的索引和切片

可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的仍然是一个Series类型)。分为显示索引和隐式索引:

(1) 显式索引:

            使用index中的元素作为索引值

            使用.loc[](推荐)

            注意: 此时是闭区间

Pandas_第2张图片

(2) 隐式索引:

            使用整数作为索引值

            使用.iloc[](推荐)

            注意: 此时是半开区间

4.Series的基本属性

可以把Series看成一个定长的有序字典

可以通过shape,size,index,values等得到series的属性

Pandas_第3张图片

可以通过head(),tail()快速查看Series对象的样式

Pandas_第4张图片

当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况

Pandas_第5张图片

可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull()函数检测缺失数据

5.Series的运算

(1) 适用于numpy的数组运算也适用于Series

(2) Series之间的运算

在运算中自动对齐不同索引的数据

如果索引不对应,则补NaN

Pandas_第6张图片

注意:要想保留所有的index,则需要使用.add()函数

DataFrame

1.什么是DataFrame

DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

            行索引:index

            列索引:columns

            值:values(numpy的二维数组)

2.如何创建DataFrame

最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。

此外,DataFrame会自动加上每一行的索引(和Series一样)。

同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。

Pandas_第7张图片
Pandas_第8张图片

DataFrame属性:values、columns、index、shape

Pandas_第9张图片

3.DataFrame的索引

(1) 对列进行索引

            通过类似字典的方式

            通过属性的方式

可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。

Pandas_第10张图片
Pandas_第11张图片

(2) 对行进行索引

            使用.ix[]来进行行索引

            使用.loc[]加index来进行行索引

            使用.iloc[]加整数来进行行索引

同样返回一个Series,index为原来的columns

Pandas_第12张图片

(3) 对元素索引的方法

            使用列索引

            使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]] 里面的[3,3]看做一个参数)

            使用values属性(二维numpy数组)

注意: 直接用中括号时

            索引表示的是列索引

            切片表示的是行切片

4.DataFrame的运算

在运算中自动对齐不同索引的数据

如果索引不对应,则补NaN

Pandas_第13张图片
Pandas_第14张图片

(2) Series与DataFrame之间的运算

【重要】

使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)

使用pandas操作函数:

              axis=0:以列为单位操作(参数必须是列),对所有列都有效。

              axis=1:以行为单位操作(参数必须是行),对所有行都有效。


处理丢失数据


None

None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

object类型的运算要比int类型的运算慢得多

Pandas_第15张图片

np.nan(NaN)

np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

但可以使用np.nan*()函数来计算nan,此时视nan为0。

pandas中的None与NaN

1) pandas中None与np.nan都视作np.nan

Pandas_第16张图片

2) pandas中None与np.nan的操作

判断函数

        isnull()

        notnull()

Pandas_第17张图片

过滤函数

        dropna(): 过滤丢失数据

        fillna(): 填充丢失数据

Pandas_第18张图片
Pandas_第19张图片
Pandas_第20张图片

层次化索引


1. 创建多层行索引

    1) 隐式构造

            最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组

            Series也可以创建多层索引

Pandas_第21张图片

    2) 显示构造pd.MultiIndex

Pandas_第22张图片

使用数组

Pandas_第23张图片

使用元组

Pandas_第24张图片

使用product(最简单,推荐使用)

Pandas_第25张图片

2.多层列索引同上

3.多层索引对象的索引与切片操作

        1)Series的操作

             重要:对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片。

Pandas_第26张图片

2)DataFrame操作

            (1) 可以直接使用列名称来进行列索引

            (2) 使用行索引需要用ix(),loc()等函数

极其重要:推荐使用loc()函数

注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!

Pandas_第27张图片

4.索引的堆(stack)

unstack()

Pandas_第28张图片

stack()

Pandas_第29张图片

小技巧:使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

小技巧:使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里

5.聚合操作

平均数,方差,最大值,最小值……

Pandas_第30张图片

pandas的拼接操作


pandas的拼接分为两种:

        级联:pd.concat, pd.append

        合并:pd.merge, pd.join

pd.concat()

1).简单级联

pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False,copy=True)

和np.concatenate一样,优先增加行数(默认axis=0),可以通过设置axis来改变级联方向

注意 index在级联时可以重复   也可以选择忽略ignore_index,重新索引

或者使用多层索引 keys   concat([x,y],keys=['x','y'])

2).不匹配级联

不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致

有3种连接方式:

            外连接:补NaN(默认模式)

            内连接:只连接匹配的项

            连接指定轴 join_axes

3) 使用append()函数添加

        级联的使用非常普遍,因此有一个函数append专门用于在后面添加

pd.merge()

merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并

使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。

注意每一列元素的顺序不要求一致

        1) 一对一合并

        2) 多对一合并

        3) 多对多合并

        4) key的规范化

                使用on=显式指定哪一列为key,当有多个key相同时使用

                使用left_on和right_on指定左右两边的列作为key,当左右两边的key都不想等时使用

        5) 内合并与外合并

                内合并:只保留两者都有的key(默认模式)

                外合并 how='outer':补NaN

                左合并、右合并:how='left',how='right'

        6) 列冲突的解决

                当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名,可以使用suffixes=自己指定后缀

你可能感兴趣的:(Pandas)