参考手册
PandasAPI参考

1.Pandas介绍

1.Pandas简介

  1. 以Numpy为基础,借助Numpy模块在计算方面性能高的优势
  2. 基于matplotlib,能够简便的画图

2.Pandas的优势

  1. 增强图表可读性
  2. 便捷的数据处理能力
  3. 读取文件方便
  4. 封装了Matplotlib、Numpy的画图和计算

2.Pandas的数据结构

Pandas中一共有三种数据结构,分别为:Series、DataFrame和MultiIndex(老版本中叫Panel)。其中Series是一维数据结构,DataFrame是二维的表格型数据结构,MultiIndex是三维的数据结构。

1.Series

image.png

1.Series的创建
  1. 创建Series使用pd.Series(data=None,index=None,dtype=None)函数,参数说明:
    1. data:传入的数据可以是ndarray,list等
    2. index:索引,必须是唯一的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引
    3. dtype: 数据的类型
  2. 通过已有数据创建Series
# 指定内容,默认索引
a = pd.Series(np.arange(10))
print(a)
# 指定内容,指定索引
a = pd.Series(data = [1,3,5,7], index=[1,2,3,4])
print(a)
# 通过字典数据创建
color_count = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})

image.png

2.Series的属性

Series中提供了两个属性index和values,用于操作Series对象中的索引和数据

import pandas as pd

obj = pd.Series({"one":1,"two":2,"three":3})
print(obj.index)#Index(['one', 'two', 'three'], dtype='object')
print(obj[2])#3
print(obj.values)#[1 2 3]

2.DataFrame

image.png

1.DataFrame的创建
  1. 创建DataFrame使用pd.DataFrame(data=None,index=None, columns=None)函数
    1. 函数参数:
      1. index:行标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
      2. columns:列标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
  2. 通过已有数据创建DataFrame
import pandas as pd

a = pd.DataFrame(np.random.randn(2,3))
print(a) # 两行三列
# 三名同学四门成绩
score = np.random.randint(40, 90, (3,4))
a =  pd.DataFrame(score)
print(a)
# 给分数增加行列索引

# 构造列索引序列
subjects = ["语文","数学","英语","地理"]
# 构造行索引序列
print(a.shape)
stu = ["学生" + str(i) for i in range(a.shape[0])]

a = pd.DataFrame(score, columns = subjects, index = stu)
print(a)

image.png

2.DataFrame的属性和方法
  1. shape:用元组表示的DataFrame的形状
  2. index:DataFrame的行索引列表
  3. columns:DataFrame的列索引列表
  4. columns:DataFrame的列索引列表
  5. T:转置
  6. head(5):显示前5行内容,如果不补充参数,默认5行。填入参数N则显示前N行
  7. tail(5):显示后5行内容,如果不补充参数,默认5行。填入参数N则显示后N行
import pandas as pd

# 三名同学四门成绩
score = np.random.randint(40, 90, (3,4))
# 给分数增加行列索引

# 构造列索引序列
subjects = ["语文","数学","英语","地理"]
# 构造行索引序列
stu = ["学生" + str(i) for i in range(a.shape[0])]

a = pd.DataFrame(score, columns = subjects, index = stu)
print(a)
print(a.shape)
print(a.index)
print(a.columns)
print(a.values)
print(a.T)

image.png

3.DataFrame索引的设置
  1. 修改行列索引值
# 修改行索引
# 三名同学四门成绩
score = np.random.randint(40, 90, (3,4))
# 给分数增加行列索引

# 构造列索引序列
subjects = ["语文","数学","英语","地理"]
# 构造行索引序列
stu = ["学生" + str(i) for i in range(a.shape[0])]

a = pd.DataFrame(score, columns = subjects, index = stu)
print(a)
stu = ["学生_" + str(i) for i in range(a.shape[0])]
a.index = stu
print(a)
  1. 重设索引:使用reset_index(drop=False)函数设置新的下标索引。
    1. drop为True表示删除原来的索引值
    2. drop默认为False,表示不删除原来索引
  2. 以某列值设置为新的索引:set_index(keys, drop=True)
    1. keys:列索引名成或者列索引名称的列表
    2. drop : boolean, default True.当做新的索引,删除原来的列
      image.png

3.MultiIndex(老版本中叫做Pannel)

多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引。MultiIndex是三维的数据结构。

1.MultiIndex的属性
  1. index属性:
    1. names:levels的名称
    2. levels:每个level的元组值

4.索引操作

测试数据(学生成绩表)如下图:
image.png

  1. 使用行列索引(先列后行)
# 1.获取学生2的数学成绩
a["数学"]["学生2"]#62
# a["学生2"]["数学"]#error
# a[2:3,1:2]#error
  1. 结合loc或者iloc使用索引
    1. 使用loc:只能指定行列索引的名字
    2. 使用iloc可以通过索引的下标去获取
# 获取学生0和学生1的数学和英语成绩
a.loc["学生0":"学生1","数学":"英语"]
	数学	英语
学生0	84	54
学生1	70	60

# 获取前两名学生,前三门成绩的结果
a.iloc[0:2:1,0:3:1]
	语文	数学	英语
学生0	54	73	51
学生1	60	50	68
  1. 使用ix组合索引:使用ix进行下标和名称组合做索引
# 获取前两名学生,语文,数学,地理三门成绩的结果
# a.ix[0:2:1,['语文','数学','地理']] error,ix已被弃用

# 推荐使用loc和iloc的方式获取
print(a.loc[a.index[0:2], ['语文','数学','地理']])
    语文  数学  地理
学生0  89  70  84
学生1  40  74  75

print(a.iloc[0:2:1, a.columns.get_indexer(['语文','数学','地理'])])

5.赋值操作

# 对a中的地理列的所有值重新赋值为0
a['地理'] = 1
a.地理 = 1

6.排序

排序有两种形式,一种对于索引进行排序,一种对于内容进行排序

1.DataFrame排序
  1. 使用对象.sort_values(by=,ascending=)对单个键或者多个键进行排序。函数参数如下:
    1. by:指定排序参考的键
    2. ascending:默认升序
      1. ascending=False:降序
      2. ascending=True:升序
#按照数学成绩对学生成绩表进行排序
a = a.sort_values(by='数学', ascending=True)
print(a)

#按照数学成绩和语文成绩进行排序
a = a.sort_values(by=['语文','数学'], ascending=True)
  1. 使用对象.sort_index()给索引进行排序
# 三名同学四门成绩
score = np.random.randint(40, 90, (3,4))
a =  pd.DataFrame(score)
# 给分数增加行列索引
# 构造列索引序列
subjects = ["语文","数学","英语","地理"]
# 构造行索引序列
stu = [2,4,1]
a = pd.DataFrame(score, columns = subjects, index = stu)
print(a)
a = a.sort_index()
print(a)

image.png

2.Series排序
  1. 使用series.sort_values(ascending=True)函数进行排序
# 三名同学四门成绩
score = np.random.randint(40, 90, (3,4))
a =  pd.DataFrame(score)
# 给分数增加行列索引
# 构造列索引序列
subjects = ["语文","数学","英语","地理"]
# 构造行索引序列
stu = [2,4,1]
a = pd.DataFrame(score, columns = subjects, index = stu)
a = a['数学']
print(type(a)) #<class 'pandas.core.series.Series'>
print(a)
a = a.sort_values(ascending=True)

image.png
2. 使用series.sort_index()函数对索引进行排序

# 三名同学四门成绩
score = np.random.randint(40, 90, (3,4))
a =  pd.DataFrame(score)
# 给分数增加行列索引
# 构造列索引序列
subjects = ["语文","数学","英语","地理"]
# 构造行索引序列
stu = [2,4,1]
a = pd.DataFrame(score, columns = subjects, index = stu)
a = a['数学']
print(type(a)) #<class 'pandas.core.series.Series'>
print(a)
a = a.sort_index()
print(a)

image.png

7.DataFrame运算

1.算数运算
  1. add(other)
  2. sub(other)
# 对学生成绩表中的语文成绩增加20分
# 对学生成绩表中的数学成绩减少20分
a['语文'].add(20)
a['数学'].sub(20)
2.逻辑运算
  1. 逻辑运算符号
# 筛选学生成绩表中语文成绩大于60的数据
a['语文'] > 60

学生0    True
学生1    True
学生2    True
Name: 语文, dtype: bool

# 逻辑判断的结果可以作为筛选的依据 
a[a['语文'] > 60]
	语文	数学	英语	地理
学生0	75	88	85	76
学生1	67	89	45	44
学生2	68	74	77	89
  1. 逻辑运算函数
    1. query(expr):expr为查询字符串
    a.query("语文>=60 & 数学>80")
    
    	语文	数学	英语	地理
    学生2	66	86	62	50
    
    1. isin(values)
    # 获取语文成绩在60分或者62分的学生数据
    a[a["语文"].isin([60,62])]
    
3.统计运算
  1. describe()函数:对数据进行综合分析,能够直接得出很多统计结果,count, mean, std, min, max 等
a.describe()

image.png
2. 统计函数
image.png
3. 累计统计函数
image.png


4.自定义运算
  1. 使用apply(func, axis=0)函数。函数参数如下:
    1. func:自定义函数
    2. axis=0:默认是列,axis=1为行进行运算
#定义一个对列,最大值-最小值的函数
data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)

8.Pandas画图

1.DataFrame的画图函数

DataFrame画图使用pandas.DataFrame.plot(kind='line')函数。参考官网

2.Series的画图函数

参考官网

9.文件读取和存取

pandas支持多种文件格式的IO操作。
image.png

1.CSV文件格式的文件读取和存储
  1. 读取:使用pandas.read_csv(filepath_or_buffer, sep =',', usecols )函数
    1. filepath_or_buffer:文件路径
    2. sep :分隔符,默认用","隔开
    3. usecols:指定读取的列名,列表形式
    4. names:指定列名
# 示例
import pandas as pd
# 读取文件,只获取指定的列数据
data = pd.read_csv("./adult.data.csv", usecols=['age','Education'])
  1. 存储:使用DataFrame.to_csv(path_or_buf=None, sep=', ’, columns=None, header=True, index=True, mode='w', encoding=None)函数
    1. path_or_buf :文件路径
    2. sep :分隔符,默认用","隔开
    3. columns :选择需要的列索引
    4. header :boolean or list of string, default True,header表示是否写进列索引值
    5. index:是否写进行索引
    6. mode:'w':重写, 'a' 追加
import pandas as pd
data = pd.read_csv("./adult.data.csv", usecols=['age','Education'])
# index=False表示不写进行索引,将age列的数据写进csv文件中
data[:10].to_csv("./test.csv", columns=['age'],index=False)
data = pd.read_csv("./test.csv")
  1. 读取CSV文件遇到的问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd4 in position 23: invalid continuation byte
解决办法:
最开始加上:
#coding: utf-8
dsr = pd.read_csv("./data/dsr.csv", encoding=u'gbk')
2.HDF5文件格式的文件读取和存储

HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame。

  1. 读取使用:pandas.read_hdf(path_or_buf,key =None,** kwargs)
    1. path_or_buffer:文件路径
    2. key:读取的键
    3. return:Theselected object
  2. 存储使用DataFrame.to_hdf(path_or_buf, key, *kwargs)
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]},
                  index=['a', 'b', 'c'])  
print(df)
df.to_hdf('data.h5', key='df', mode='w')  
df = pd.read_hdf('data.h5',key='df')
3.JSON文件格式的文件读取和存储
  1. 读取使用:pandas.read_json(path_or_buf=None, orient=None, typ='frame',lines=False):将JSON格式准换成默认的Pandas DataFrame格式。
    1. orient : string,Indication of expected JSON string format.
      1. 'split' : dict like {index -> [index], columns -> [columns], data -> [values]}
        split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
      2. 'records' : list like [{column -> value}, ... , {column -> value}]
        records 以columns:values的形式输出
      3. 'index' : dict like {index -> {column -> value}}
        index 以index:{columns:values}...的形式输出
      4. 'columns' : dict like {column -> {index -> value}},默认该格式
        colums 以columns:{index:values}的形式输出
      5. 'values' : just the values array
        values 直接输出值
    2. lines : boolean, default False
      按照每行读取json对象
    3. typ : default ‘frame’, 指定转换成的对象类型series或者dataframe
  2. 存储使用:DataFrame.to_json(path_or_buf=None, orient=None, lines=False),将Pandas对象存储为json格式
    1. path_or_buf=None:文件地址
    2. orient:存储的json形式,
    3. lines:一个对象存储为一行
import pandas as pd
df = pd.DataFrame([['a', 'b'], ['c', 'd']],
                  index=['row 1', 'row 2'],
                  columns=['col 1', 'col 2'])
df.to_json("test.json",orient='split')
#       col 1 col 2
# row 1     a     b
# row 2     c     d
print(df)
pd.read_json("test.json", orient='split')

10.缺失值处理

  1. 缺失值使用NaN标记
    1. 判断数据中是否包含NaN
      1. pd.isnull(df),
      2. pd.notnull(df)
    # 判断缺失值结合numpy中的any和all函数
    np.any(pd.isnull(movie)) # 里面如果有一个缺失值,就返回True
    np.all(pd.notnull(movie)) # 里面如果有一个缺失值,就返回False
    
    1. 删除存在的缺失值:使用dropna(axis='rows'),该函数不会修改原数据,需要接收返回值。
    2. 替换缺失值:使用fillna(value,inplace=True)
      1. value:替换成的值
      2. inplace:True:会修改原数据,False:不替换修改原数据,生成新的对象
  2. 缺失值不使用NaN标记,比如使用?,则将?替换为numpy.NaN。使用df.replace(to_replace=, value=)函数
    1. to_replace:替换前的值
    2. value:替换后的值`
import pandas as pd
import numpy as np
wis = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data")
# 把一些其它值(这里是?)标记的缺失值,替换成np.nan
wis = wis.replace(to_replace='?', value=np.nan)
# 删除缺失值
wis = wis.dropna()
wis

11.数据离散化

  1. 数据的离散化:连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。
    1. 对数据进行分组使用pd.qcut(data,q)函数,一般会和value_counts函数搭配使用,统计每组的个数
    2. series.value_counts():统计分组中的次数
    // 对age进行离散化
    import pandas as pd
    data = pd.read_csv("./adult.data.csv")
    age = data['age']
    # 分为三组
    age = pd.qcut(age, 3)
    print(age)
    # 计算分到每个组的数据个数
    age.value_counts()
    
    image.png
    3. 自定义分组使用pd.cut(data,bins)函数
    import pandas as pd
    data = pd.read_csv("./adult.data.csv")
    age = data['age']
    # 自己指定分组区间
    bins = [18,30,60,100]
    age = pd.cut(age, bins=bins)
    print(age)
    # 计算分到每个组的数据个数
    age.value_counts()
    
    image.png
  2. one-hot编码:把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码。
    1. 使用pandas.get_dummies(data, prefix=None)函数
      1. data:array-like, Series, or DataFrame
      2. prefix:分组名字
import pandas as pd
data = pd.read_csv("./adult.data.csv")
age = data['age']
# 自己指定分组区间
bins = [18,30,60,100]
age = pd.cut(age, bins=bins)
pd.get_dummies(age)

image.png

# 使用prefix的效果
pd.get_dummies(age,prefix="年龄段")

image.png

12.合并

数据由多张表组成,那么有时候需要将不同的内容合并在一起分析。

13.交叉表和透视表

14.分组和聚合

image.png

  1. 分组使用DataFrame.groupby(key, as_index=False)函数。
    1. key:分组的列数据,可以多个
    2. as_index:是否进行索引
import pandas as pd
col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
# 进行分组,对颜色分组,price进行聚合
col.groupby(['color'])['price1'].mean()
col['price1'].groupby(col['color']).mean()

image.png