Loading

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
posted @ 2022-12-26 19:21  马路野狼  阅读(25)  评论(0)    收藏  举报