概述
Pandas的数据结构: Pandas主要有Series(一维数组), DataFrame(二维数组), Panel(三维数组), Panel4D(四维数组), PanelND(更多维数组)等数据结构. 其中Series和DataFrame应用的最为广泛。
Series是一维带标签的数组, 它可以包含任何数据类型. 包括整数, 字符串, 浮点数, Python对象等. Series可以通过标签来定位.
DataFrame是二维的带标签的数据结构. 我们可以通过标签来定位数据. 这是NumPy所没有的.
查看pandas版本
1 | >>> print(pd.__version__) |
Series
创建Series
Series可以看做由一列数据组成的数据集
Series语法如下1
s = pd.Series(data, index=index)
常用的创建Series的方法有如下三种:
从列表创建Series
1 | >>> arr = ['a', 'b', 'c', 'd'] |
从Ndarray创建Series
1 | >>> n = np.random.randn(5) # 几行几列 |
从字典创建Series
1 | >>> dict = {'a':1, 'b':2, 'c':3, 'd':4} |
Seires基本操作
修改Series索引
1 | >>> s1 |
Series纵向拼接
1 | >>> s1 |
Series按照指定索引删除元素
1 | >>> s4.drop('a') |
Series修改指定索引的元素
1 | >>> s4['a'] = [11, 'a1'] |
Series按照指定索引查找元素
1 | >>> s4['a'] |
Series切片
1 | >>> s1 |
Series运算
Series加法运算
1 | >>> s1 |
Series减法运算
1 | >>> s3 |
Series乘法运算
1 | >>> s3 |
Series除法运算
1 | >>> s3 |
Series求中位数
1 | >>> s3 |
Series求和
1 | >>> s3 |
Series最大值
1 | >>> s3 |
Series最小值
1 | >>> s3 |
Series缺失值的检测
1 | >>> series_10 = pd.Series({'a':10, 'b':20, 'c':30, 'd':40}) |
isnull和notnull检测Series中的缺失值, 返回bool类型的Series值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38>>> pd.isnull(ser_10)
a False
b False
c False
dtype: bool
>>> pd.isnull(ser_20)
a False
b False
c False
d True
dtype: bool
>>> pd.notnull(ser_10)
a True
b True
c True
dtype: bool
>>> pd.notnull(ser_20)
a True
b True
c True
d False
dtype: bool
>>> ser_20
a 10.0
b 20.0
c 30.0
d NaN
dtype: float64
>>> ser_20[pd.isnull(ser_20)] # 相当于过滤掉缺失值
d NaN
dtype: float64
>>> ser_20[pd.notnull(ser_20)]
a 10.0
b 20.0
c 30.0
dtype: float64
Series自动对齐
1 | >>> series_1 = pd.Series([1,2,3,4], index=['a','b','c','d']) |
Series及其name属性
1 | >>> series_1.name = "hello world" |
DataFrame
创建DataFrame
通过NumPy数组创建DataFrame
1 | >>> dates = pd.date_range('today', periods=6) |
通过dict创建DataFrame
1 | >>> data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'], |
1 | >>> data = {'成绩':[90, 90, 99], '姓名': ['Tony','Wayne','Moon'], '爱好':['篮球','排球','乒乓球']} |
DataFrame通过二维数组创建
1 | >>> df_1 = pd.DataFrame([['Wayne', 'Tony', 'Moon'],[90, 80, 70]]) |
DataFrame获取数据
查看index, columns和values
1 | >>> df_1.index |
查看前几行和后几行
1 | >>> df2.head() |
通过标签查询单列
1 | >>> df1 |
通过标签查询多列
1 | >>> df1[['A','B']] |
通过位置查询
1 | >>> df1.iloc[1:3] |
查看DataFrame的统计数据
1 | >>> df1.describe() |
DataFrame基本操作
DataFrame转置
1 | >>> df1 |
DataFrame按列排序
1 | >>> df1 |
DataFrame切片
1 | >>> df1 |
Dataframe副本copy
1 | >>> df3 = df2.copy() |
列添加
1 | >>> df_1['location'] = ['SH', 'BJ', 'GZ'] |
列删除
1 | >>> df_1 |
列修改
1 | >>> df_1['location'] = ['SJZ','TY','ZZ'] |
行的获取
1 | >>> df_1 |
行增加
1 | >>> df_1.ix['ooxx'] = [88, 'Bessie', 'QHD'] |
行修改
1 | >>> df_1.ix['ooxx'] = [88, 'Bessie', 'SH'] |
行删除
1 | >>> df_1.drop('xxoo') |
索引对象
pandas基本功能
数据文件读取和文本数据读取
通过pandas.read_xx相关函数可以读取文件中的数据, 并形成DataFrame, 常用的方法为read_csv, 主要读取文本类型的数据
1 | cat data.csv |
索引, 选取和数据过滤
1 | >>> df01 = pd.read_csv('data.csv') |
缺省值NaN的处理方法
1 | cat data1.txt |
1 | >>> df01 = pd.DataFrame(np.random.randint(1,9,size=(4,4))) |
1 | >>> from pandas import DataFrame |
常用的数学统计方法
| 方法 | 说明 |
|---|---|
| count | 计算非NA值的数量 |
| describe | 针对Series或各个DataFrame列计算总的统计值 |
| min/max | |
| argmin/argmax | 计算能够获取到最小值和最大值的索引位置(整数) |
| idxmin/idxmax | 算能够获取到最小值和最大值的索引值 |
| quantile | 计算样本的分位数(0或1) |
| sum | 值的总和 |
| mean | 值的平均数 |
| median | 值的中位数 |
| mad | 根据平均值计算平均绝对距离差 |
| var | 样本值的方差 |
| std | 样本值的标准差 |
| cumsum | 样本值的累计和 |
| cummin/cummax | 样本的累计最小值和最大值 |
| cumprod | 样本值的累计积 |
| pct_change | 百分数的变化 |
相关系数与协方差
1 | >>> df = DataFrame({'GDP':[12, 23, 34, 45, 56], 'air_temperature': [23, 25, 26, 27, 30], 'year':['2001','2002','2003','2004','2005']}) |
唯一值, 值计数以及成员资格
- unique用于获取Series中的唯一值数组(去重后的数组)
- value_counts用于计算一个Series中各值的出现的频率
- isin用于判断矢量化集合中的成员资格, 可用于选取Series中或者DataFrame中列数据的子集
1 | >>> from pandas import Series |
算法运算和数据对齐
函数的应用和映射
层次索引
- 在某一个方向上拥有多个(两个或两个以上)索引级别
- 通过层次化索引, pandas能够以较低维度的形式处理高维度的数据
- 通过层次化索引, 可以按照层次统计数据
- 层次所以包括Series层次索引和DataFrame层次索引
1 | >>> data = Series([988.44, 95895, 3959, 32554, 1235], index=[['2001','2001','2001','2002','2002'],['苹果','香蕉','西瓜','苹果','西瓜']]) |