Pandas基础
Pandas库-Series类型
默认索引
#input#
import pandas as pd
a=pd.Series([9,8,7,6])
a#显示a的信息
#output#
0 9
1 8
2 7
3 6
dtype: int64
其中左侧为索引,右侧为数据,数据类型为int64(沿用numpy数据类型)
自定义索引
#input#
import pandas as pd
b=pd.Series([9,8,7,6],index=['a','b','c','d'])
b#显示b的信息
#output#
a 9
b 8
c 7
d 6
dtype: int64
创建
| 可以创建Series的类型 |
|---|
| 列表 |
| 标量值 |
| 字典 |
| ndarray |
| 其他函数 |
用标量值创建
#input#
import pandas as pd
s=pd.Series(25,index=['a','b','c'])#用值25创建,index不能省略
s#显示s的信息
#output#
a 25
b 25
c 25
dtype: int64
用字典创建
例1
#input#
import pandas as pd
d=pd.Series({'a':9,'b':8,'c':7})
d#显示d的信息
#output#
a 9
b 8
c 7
dtype: int64
例2
#input#
import pandas as pd
e=pd.Series({'a':9,'b':8,'c':7},index=['c','a','b','d'])
e#输出e的信息
#output#
c 7.0
a 9.0
b 8.0
d NaN
dtype: float64
index所对应的值来源于第一个字典参数,c对应7...,d没有对应,默认NaN
用ndarray创建
例1
#input#
import pandas as pd
import numpy as np
n=pd.Series(np.arange(5))
n#输出n的信息
0 0
1 1
2 2
3 3
4 4
dtype: int32
例2
#input#
import pandas as pd
import numpy as np
m=pd.Series(np.arange(5),index=np.arange(9,4,-1))
m#输出m的信息
9 0
8 1
7 2
6 3
5 4
dtype: int32
基本操作
例1
#IPython控制台操作#
import pandas as pd
b=pd.Series([9,8,7,6],['a','b','c','d'])#创建值,指定索引
b
Out[3]:
a 9
b 8
c 7
d 6
dtype: int64
b.index
Out[4]: Index(['a', 'b', 'c', 'd'], dtype='object')#索引为pandas定义的Index类型
b.values
Out[5]: array([9, 8, 7, 6], dtype=int64)#值为numpy定义的ndarray类型
b['b']
Out[6]: 8
b[1]
Out[7]: 8
b[['c','d',0]]#索引方式需一致,不然就像下面一样报错
Traceback (most recent call last):
File "<ipython-input-8-9469556e3898>", line 1, in <module>
b[['c','d',0]]
File "E:\Anaconda\lib\site-packages\pandas\core\series.py", line 910, in __getitem__
return self._get_with(key)
File "E:\Anaconda\lib\site-packages\pandas\core\series.py", line 958, in _get_with
return self.loc[key]
File "E:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1767, in __getitem__
return self._getitem_axis(maybe_callable, axis=axis)
File "E:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1953, in _getitem_axis
return self._getitem_iterable(key, axis=axis)
File "E:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1594, in _getitem_iterable
keyarr, indexer = self._get_listlike_indexer(key, axis, raise_missing=False)
File "E:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1552, in _get_listlike_indexer
keyarr, indexer, o._get_axis_number(axis), raise_missing=raise_missing
File "E:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1654, in _validate_read_indexer
"Passing list-likes to .loc or [] with any missing labels "
KeyError: 'Passing list-likes to .loc or [] with any missing labels is no longer supported, see https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike'
b[['c','d','a']]#一致的索引
Out[9]:
c 7
d 6
a 9
dtype: int64
例2
#IPython控制台操作#
import pandas as pd
import numpy as np
b=pd.Series([9,8,7,6],['a','b','c','d'])
b
Out[4]:
a 9
b 8
c 7
d 6
dtype: int64
b[3]
Out[5]: 6
b[:3]#切片结果仍然为Series类型,结果保留自定义索引
Out[6]:
a 9
b 8
c 7
dtype: int64
b[b>b.median()]#可以使用ndarray的操作
Out[7]:
a 9
b 8
dtype: int64
np.exp(b)
Out[8]:
a 8103.083928
b 2980.957987
c 1096.633158
d 403.428793
dtype: float64
| Series类型操作和ndarray类似 |
|---|
| 索引方式相同,用[] |
| NumPy中的运算和操作可用于Series类型 |
| 可以通过自定义索引的列表进行切片 |
| 可以通过自动索引进行切片,如果存在自定义索引,则一同被切片 |
例3
#IPython控制台操作#
import pandas as pd
b=pd.Series([9,8,7,6],['a','b','c','d'])
b['b']
Out[3]: 8
'c' in b #in判断的是索引,这里为'c'是否在b的索引里面
Out[4]: True
0 in b
Out[5]: False
b.get('f',100) #如果存在索引'b',返回索引对应的值;不存在索引'b'的话,返回100
Out[6]: 100
| Series类型的操作类似Python字典类型 |
|---|
| 通过自定义索引访问 |
| 保留字in操作 |
| 使用.get()方法 |
对齐操作
Series+Series
#IPython控制台操作#
import pandas as pd
a=pd.Series([1,2,3],['c','d','e'])
b=pd.Series([9,8,7,6],['a','b','c','d'])
a+b
Out[4]:
a NaN
b NaN
c 8.0
d 8.0
e NaN
dtype: float64
Series类型在运算中自动对齐不同索引的数据
Series的修改
import pandas as pd
b=pd.Series([9,8,7,6],['a','b','c','d'])
b['a']=15
b.name="Series"
b.index.name="索引"
b
Out[6]:
索引
a 15
b 8
c 7
d 6
Name: Series, dtype: int64
b.name="New Series"
b['b','c']=20
b
Out[9]:
索引
a 15
b 20
c 20
d 6
Name: New Series, dtype: int64
- Series可以随时修改,立即生效
- 可以设置Series.name和Series.index.name属性
Pandas库-DataFrame类型
DataFrame=共用相同索引的一组列
- 每列值的类型可以不同
- DataFrame既有行索引,也有列索引
DataFrame的创建
| 可以创建DataFrame的类型 |
|---|
| 二维ndarray |
| 一维ndarray、列表、字典、元组或Series构成的字典 |
| Series |
| 其他DataFrame |
由二维ndarray创建
#IPython控制台操作#
import pandas as pd
import numpy as np
d=pd.DataFrame(np.arange(10).reshape(2,5))
d
Out[4]:
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
此例的DataFrame就是原数据加上行和列的索引
由一维对象构成的字典创建
Series构成的字典
#IPython控制台操作#
import pandas as pd
dt={'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([9,8,7,6],index=['a','b','c','d'])}
d=pd.DataFrame(dt)
d
Out[4]:
one two
a 1.0 9
b 2.0 8
c 3.0 7
d NaN 6
pd.DataFrame(dt,index=['b','c','a'],columns=['two','three'])
Out[5]:
two three
b 8 NaN
c 7 NaN
a 9 NaN
索引为'three'的列是没有的,但会自动补齐
列表构成的字典
#IPython控制台操作#
import pandas as pd
d1={'one':[1,2,3,4],'two':[9,8,7,6]}
import pandas as pd
dl={'one':[1,2,3,4],'two':[9,8,7,6]}
d=pd.DataFrame(dl,index=['a','b','c','d'])#字典没规定行索引,这里规定
d
Out[4]:
one two
a 1 9
b 2 8
c 3 7
d 4 6
d['a']['one']#这种方法是错误的,必须先列后行
##KeyError: 'a'##
d['one']['a']
Out[6]: 1
d['one']
Out[7]:
a 1
b 2
c 3
d 4
Name: one, dtype: int64
d.index
Out[8]: Index(['a', 'b', 'c', 'd'], dtype='object')
d.columns
Out[9]: Index(['one', 'two'], dtype='object')
d.values
Out[10]:
array([[1, 9],
[2, 8],
[3, 7],
[4, 6]], dtype=int64)
数据类型操作
重新索引
DataFrame.reindex(index=None,columns=None,...)
| 参数 | 说明 |
|---|---|
| index,columns | 新的行列自定义索引 |
| fill_value | 重新索引中,用于填充缺失位置的值 |
| method | 填充方法,fill当前值向前填充(等于前一项的值),bfill向后填充 |
| limit | 最大填充量 |
| copy | 默认True,生成新的对象 |
索引类型操作
| 方法 | 说明 |
|---|---|
| .append(idx) | 连接另一个Index对象,产生新的Index对象 |
| .diff(idx) | 计算差集,产生新的Index对象 |
| .intersection(idx) | 计算交集 |
| .union(idx) | 计算并集 |
| .delete(loc) | 删除loc位置处的元素 |
| .insert(loc,e) | 在loc位置增加一个元素 |
#IPython控制台操作#
import pandas as pd
a={"城市":["沈阳","深圳","广州","上海","北京"],"同比":[101.4,102.0,101.3,101.2,101.5],"环比":[100.1,102.0,101.3,101.2,101.5],"定基":[101.6,145.5,120.0,127.8,121.4]}#列表组成字典创建DataFrame,指定了列索引名
a
Out[3]:
{'城市': ['沈阳', '深圳', '广州', '上海', '北京'],
'同比': [101.4, 102.0, 101.3, 101.2, 101.5],
'环比': [100.1, 102.0, 101.3, 101.2, 101.5],
'定基': [101.6, 145.5, 120.0, 127.8, 121.4]}
b=pd.DataFrame(a,index=['c5','c4','c3','c2','c1'])#指定行索引名
b
Out[5]:
城市 同比 环比 定基
c5 沈阳 101.4 100.1 101.6
c4 深圳 102.0 102.0 145.5
c3 广州 101.3 101.3 120.0
c2 上海 101.2 101.2 127.8
c1 北京 101.5 101.5 121.4
nc=b.columns.delete(2)#删除列索引下标为2的项
nc
Out[7]: Index(['城市', '同比', '定基'], dtype='object')
ni=b.index.insert(5,'c0')#在行索引下标为5的地方插入行索引名'c0'
ni
Out[8]: Index(['c5', 'c4', 'c3', 'c2', 'c1', 'c0'], dtype='object')
nb=b.reindex(index=ni,columns=nc)#按照新的index,columns重新指定索引
nb
Out[9]:
城市 同比 定基
c5 沈阳 101.4 101.6
c4 深圳 102.0 145.5
c3 广州 101.3 120.0
c2 上海 101.2 127.8
c1 北京 101.5 121.4
c0 NaN NaN NaN
nb.drop('c0')#删除索引'c0',默认axis=0
Out[10]:
城市 同比 定基
c5 沈阳 101.4 101.6
c4 深圳 102.0 145.5
c3 广州 101.3 120.0
c2 上海 101.2 127.8
c1 北京 101.5 121.4
nb.drop('同比',axis=1)#删除索引'同比',指定axis=1
Out[11]:
城市 定基
c5 沈阳 101.6
c4 深圳 145.5
c3 广州 120.0
c2 上海 127.8
c1 北京 121.4
c0 NaN NaN
数据类型计算
算术运算法则
- 算术运算根据行列索引,补齐后运算,结果默认为浮点数
- 补齐时缺项填充NaN(空值)
- 二维和一维、一维和零维为广播运算
- 采用+ - * / 符号进行的二元运算产生新的对象
也可以用如下函数进行四则运算:
方法 说明 .add(d,**argws) 类型间加法运算,可选参数 .sub(d,**argws) 类型间减法运算,可选参数 .mul(d,**argws) 类型间乘法运算,可选参数 .div(d,**argws) 类型间除法运算,可选参数
一般四则运算
#IPython控制台操作#
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
a
Out[4]:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
b=pd.DataFrame(np.arange(20).reshape(4,5))
b
Out[6]:
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
a+b
Out[7]:
0 1 2 3 4
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN
a*b
Out[8]:
0 1 2 3 4
0 0.0 1.0 4.0 9.0 NaN
1 20.0 30.0 42.0 56.0 NaN
2 80.0 99.0 120.0 143.0 NaN
3 NaN NaN NaN NaN NaN
用函数进行四则运算
#IPython控制台操作#
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
a
Out[4]:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
b=pd.DataFrame(np.arange(20).reshape(4,5))
b
Out[6]:
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
b.add(a,fill_value=100) #100代替NaN进行运算
Out[7]:
0 1 2 3 4
0 0.0 2.0 4.0 6.0 104.0
1 9.0 11.0 13.0 15.0 109.0
2 18.0 20.0 22.0 24.0 114.0
3 115.0 116.0 117.0 118.0 119.0
a.mul(b,fill_value=0) #0代替NaN进行运算
Out[8]:
0 1 2 3 4
0 0.0 1.0 4.0 9.0 0.0
1 20.0 30.0 42.0 56.0 0.0
2 80.0 99.0 120.0 143.0 0.0
3 0.0 0.0 0.0 0.0 0.0
广播运算
#IPython控制台操作#
import pandas as pd
import numpy as np
b=pd.DataFrame(np.arange(20).reshape(4,5))
b
Out[4]:
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
c=pd.Series(np.arange(4))
c
Out[6]:
0 0
1 1
2 2
3 3
dtype: int32
c-10 #c的每一个值-10
Out[7]:
0 -10
1 -9
2 -8
3 -7
dtype: int32
b-c #b每一行-c
Out[8]:
0 1 2 3 4
0 0.0 0.0 0.0 0.0 NaN
1 5.0 5.0 5.0 5.0 NaN
2 10.0 10.0 10.0 10.0 NaN
3 15.0 15.0 15.0 15.0 NaN
默认运算发生在高维数据的0轴上,要想在其他轴上,可类似
b.sub(c,axis=1)来指定。
比较运算
#IPython控制台操作#
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
a
Out[4]:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
d=pd.DataFrame(np.arange(12,0,-1).reshape(3,4))
d
Out[6]:
0 1 2 3
0 12 11 10 9
1 8 7 6 5
2 4 3 2 1
a>d #比较运算
Out[7]:
0 1 2 3
0 False False False False
1 False False False True
2 True True True True
a==d #比较运算
Out[8]:
0 1 2 3
0 False False False False
1 False False True False
2 False False False False
同维度比较运算,数据规模必须一样
#IPython控制台操作#
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
a
Out[4]:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
c=pd.Series(np.arange(4))
c
Out[6]:
0 0
1 1
2 2
3 3
dtype: int32
a>c
Out[7]:
0 1 2 3
0 False False False False
1 True True True True
2 True True True True
c>0
Out[8]:
0 False
1 True
2 True
3 True
dtype: bool
不同维度比较,广播运算,默认在1轴
Pandas库-统计
| 摘要 |
|---|
| 基本统计(包括排序) |
| 分布 |
| 数据特征(相关性、周期性等) |
| 数据挖掘(形成知识) |
数据的基本统计
排序
| 函数 | 功能 |
|---|---|
| .sort_index(axis=0,ascending=True) | 指定轴然后根据索引排序 |
| Series.sort_values(axis=0,ascending=True) | Series指定轴进行排序 |
| DataFrame.sort_values(by,axis=0,ascending=True) | by指定特定索引,按该索引排序 |
排序后,NaN统一放到最后
#IPython控制台操作#
import pandas as pd
import numpy as np
b=pd.DataFrame(np.arange(20).reshape(4,5),index=['c','a','d','b'])
b
Out[4]:
0 1 2 3 4
c 0 1 2 3 4
a 5 6 7 8 9
d 10 11 12 13 14
b 15 16 17 18 19
b.sort_index()
Out[5]:
0 1 2 3 4
a 5 6 7 8 9
b 15 16 17 18 19
c 0 1 2 3 4
d 10 11 12 13 14
b.sort_index(ascending=False)
Out[6]:
0 1 2 3 4
d 10 11 12 13 14
c 0 1 2 3 4
b 15 16 17 18 19
a 5 6 7 8 9
c=b.sort_index(axis=1,ascending=False)
c
Out[8]:
4 3 2 1 0
c 4 3 2 1 0
a 9 8 7 6 5
d 14 13 12 11 10
b 19 18 17 16 15
c=b.sort_values(2,ascending=False)#按下标为2的列降序排序
c
Out[10]:
0 1 2 3 4
b 15 16 17 18 19
d 10 11 12 13 14
a 5 6 7 8 9
c 0 1 2 3 4
c=c.sort_values('a',axis=1,ascending=False)#按1轴,索引为'a'的数据排序
c
Out[12]:
4 3 2 1 0
b 19 18 17 16 15
d 14 13 12 11 10
a 9 8 7 6 5
c 4 3 2 1 0
数据的基本统计分析
| 方法 | 说明 |
|---|---|
| .sum() | 计算数据总和,按0轴计算,下同 |
| .count() | 非NaN值的数量 |
| .mean() | 计算数据的算术平均值 |
| .median() | 计算数据的算术中位数 |
| .var() .std() | 计算数据的方差、标准差 |
| .min() .max() | 计算数据的最小值、最大值 |
| .argmin() .argmax() | 计算数据最大值、最小值位置的索引位置(自动索引) |
| .idxmin() .idxmax() | 计算数据最大值、最小值所在位置的索引(自定义索引) |
| .describe() | 针对0轴对上面所有的分析进行汇总显示 |
例1
import pandas as pd
a=pd.Series([9,8,7,6],index=['a','b','c','d'])
a
Out[3]:
a 9
b 8
c 7
d 6
dtype: int64
a.describe()
Out[4]:
count 4.000000
mean 7.500000
std 1.290994
min 6.000000
25% 6.750000
50% 7.500000
75% 8.250000
max 9.000000
dtype: float64
type(a.describe()) #返回的类型为Series
Out[5]: pandas.core.series.Series
a.describe()['count'] #当做Series来操作
Out[6]: 4.0
a.describe()['max'] #当做Series来操作
Out[7]: 9.0
例2
#IPython控制台操作#
import pandas as pd
import numpy as np
b=pd.DataFrame(np.arange(20).reshape(4,5),index=['c','a','d','b'])
b
Out[4]:
0 1 2 3 4
c 0 1 2 3 4
a 5 6 7 8 9
d 10 11 12 13 14
b 15 16 17 18 19
b.describe()
Out[5]:
0 1 2 3 4
count 4.000000 4.000000 4.000000 4.000000 4.000000
mean 7.500000 8.500000 9.500000 10.500000 11.500000
std 6.454972 6.454972 6.454972 6.454972 6.454972
min 0.000000 1.000000 2.000000 3.000000 4.000000
25% 3.750000 4.750000 5.750000 6.750000 7.750000
50% 7.500000 8.500000 9.500000 10.500000 11.500000
75% 11.250000 12.250000 13.250000 14.250000 15.250000
max 15.000000 16.000000 17.000000 18.000000 19.000000
type(b.describe()) #返回的是DataFrame类型
Out[6]: pandas.core.frame.DataFrame
b.describe().loc['max'] #访问行
Out[7]:
0 15.0
1 16.0
2 17.0
3 18.0
4 19.0
Name: max, dtype: float64
b.describe()[2] #访问列
Out[8]:
count 4.000000
mean 9.500000
std 6.454972
min 2.000000
25% 5.750000
50% 9.500000
75% 13.250000
max 17.000000
Name: 2, dtype: float64
累计统计分析函数
函数适用于Series和DataFrame
| 方法 | 说明 |
|---|---|
| .cumsum() | 依次给出前1、2、...、n个数的和,下面类似 |
| .cumprod() | 积 |
| .cummax() | 最大值 |
| .cummin() | 最小值 |
| 方法 | 说明 |
|---|---|
| .rolling(w).sum() | 依次计算相邻w个元素的和,下面类似 |
| .rolling(w).mean() | 算术平均值 |
| .rolling(w).var() | 方差 |
| .rolling(w).std() | 标准差 |
| .rolling(w).min().max() | 最小、最大值 |
例1
#IPython控制台操作#
import pandas as pd
import numpy as np
b=pd.DataFrame(np.arange(20).reshape(4,5),index=['c','a','d','b'])
b
Out[4]:
0 1 2 3 4
c 0 1 2 3 4
a 5 6 7 8 9
d 10 11 12 13 14
b 15 16 17 18 19
b.cumsum()
Out[5]:
0 1 2 3 4
c 0 1 2 3 4
a 5 7 9 11 13
d 15 18 21 24 27
b 30 34 38 42 46
例2
#IPython控制台操作#
import pandas as pd
import numpy as np
b=pd.DataFrame(np.arange(20).reshape(4,5),index=['c','a','d','b'])
b
Out[4]:
0 1 2 3 4
c 0 1 2 3 4
a 5 6 7 8 9
d 10 11 12 13 14
b 15 16 17 18 19
b.rolling(2).sum() #第一行=前一项+此项 前一项=NaN
Out[5]:
0 1 2 3 4
c NaN NaN NaN NaN NaN
a 5.0 7.0 9.0 11.0 13.0
d 15.0 17.0 19.0 21.0 23.0
b 25.0 27.0 29.0 31.0 33.0
b.rolling(3).sum()
Out[6]:
0 1 2 3 4
c NaN NaN NaN NaN NaN
a NaN NaN NaN NaN NaN
d 15.0 18.0 21.0 24.0 27.0
b 30.0 33.0 36.0 39.0 42.0
数据相关性分析
协方差:\(cov(X,Y)=\frac{\sum_{i=1}^n(X_i-\bar{X})(Y_i-\bar{Y})}{n-1}\)
- 协方差>0,X与Y正相关
- 协方差<0,X与Y负相关
- 协方差=0,X与Y独立无关
Pearson相关系数:\(r=\frac{\sum_{i=1}^n(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^n(x_i-\bar{x})^2} \sqrt{\sum_{i=1}^n(y_i-\bar{y})^2}}\)
\(r\in[-1,1]\)
- \(r\in[0.8,1.0]\) 极强相关
- \(r\in[0.6,0.8]\) 强相关
- \(r\in[0.4,0.6]\) 中等程度相关
- \(r\in[0.2,0.4]\) 弱相关
- \(r\in[0.0,0.2]\) 极弱相关
| 方法 | 说明 |
|---|---|
| .cov() | 计算协方差矩阵 |
| .corr() | 计算相关系数矩阵,Pearson、Spearman、Kendall |
#IPython控制台操作#
import pandas as pd
hprice=pd.Series([3.04,22.93,12.75,22.6,12.33],index=['2008','2009','2010','2011','2012'])
m2=pd.Series([8.18,18.38,9.13,7.82,6.69],index=['2008','2009','2010','2011','2012'])
hprice.corr(m2)
Out[4]: 0.5239439145220387

浙公网安备 33010602011771号