Pandas是专门用于数据挖掘的开源Python库。以Numpy为基础,具有良好的计算性能;基于Matplotlib,能够简便地绘图;还有自带独特的数据结构
Pandas优势:
Pandas的数据结构主要有三种:
Series是一个类似与一维数组的数据结构,它能保存任意类型的数据,如整数浮点数字符串等,主要由一组数据和与之相关的索引两部分构成
Series的创建
import pandas as pd
pd.Series(data=None, index=None, dtype=None)
参数:
通过已有数据创建:
# 指定内容,默认索引
pd.Series(np.arrange(10))
# 指定索引
pd.Series([1,2,3,4,5], index=[0,1,2,3,4])
通过字典数据创建:
count = pd.Series({'red':100, 'blue':200, 'green':500, 'yellow':1000})
Series的属性:
为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性index和values
index
# 获取全部索引
count.index
values
# 获取全部数据
count.values
DataFrame的创建
# 导入pandas
import pandas as pd
pd.DataFrame(data=None, index=None, columns=None)
参数:
创建实例:
# 创建两行三列0-1之间的随机数表
pd.DataFrame(np.random.randn(2,3))
# 创建学生成绩表
score = np.random.randint(40, 100, (10, 5)) # 成绩
subjects = ["英语", "数学", "专业课", "政治"] # 科目
stu = [str(i + 1) + '号考生' for i in range(10)] # 学生
data = pd.DataFrame(score, columns=subjects, index=stu)
DataFrame的属性
Shape
# 获取DataFrame的形状
data.shape
index
# 获取行索引列表
data.index
columns
# 获取列索引列表
data.columns
values
# 直接获取其中的值
data.values
T
# 返回转置的表格
data.T
head(n)
# 返回前5行数据
data.head(5)
tail(n)
# 返回后5行数据
data.tail(5)
DataFrame索引设置
注意:修改行列索引值的时候必须整体全部修改,不能只改单个
直接修改行列索引值
stu = ["学生" + str(i) for i in range(10)]
data.index = stu
- 重置索引
```python
data.reset_index(drop=False) # drop表示是否删除原来索引,True删False不删
以某列为索引
df = pd.DataFrame({'month':[1,4,7,10],'year':[2012,2014,2016,2018], 'sale':[31,40,55,84]})
df.set_index('month') # 以month为索引
df.set_index(['month', 'year']) # 设置多个索引,以年和月份,变成了MultiIndex的DataFrame
MultiIndex是一个三维的数据结构:多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引
MultiIndex的特性
# 接上个代码块,df为设置了多个索引的DataFrame
df.index # 查看索引结果
index属性
names:levels的名称
df.index.names
levels:每个level的元组值
df.index.levels
MultiIndex的创建
arrays = [[1,1,2,2], ['red','blue','red','blue']]
pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
Numpy中可以使用索引选取序列和切片选择,Pandas也支持类似的操作,也可以直接使用列名称和行名称,甚至组合使用
直接使用行列索引(先列后行)
例:获取‘2018-02-27’这天的‘close’的结果
# 直接使用行列索引名字的方式(切记是先列后行)
data['close']['2018-02-27']
# 不支持的操作:
data['2018-02-27']['close'] # 报错,pandas索引先列后行
data[:1, :2] # 报错,pandas不支持直接切片
结合loc或iloc使用索引
例:获取从‘2018-02-27’到‘2018-02-22’,‘open’的结果
# 使用loc:只能指定行列索引的名字
# 注意loc使用的是先行后列的索引
data.loc['2018-02-27':'2018-02-22', 'open']
# 使用iloc: 可以通过索引的下标去获取
# 获取前3天的数据,前5列的结果
data.iloc[:3, :5] # 同样是先行后列
使用ix组合索引(不推荐)
例:获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这四个指标的结果
# 使用ix进行小标和名称组合的索引
data.ix[0:4, ['open', 'close', 'high', 'low']]
# 推荐使用loc或iloc写法
data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
例:对DataFrame当中的close列重新赋值为1
# 直接修改原来的值
data['close'] = 1
# 或者通过.的方式赋值
data.close = 1
排序有两种方式,一种对于索引进行排序,一种对于内容进行排序
DataFrame排序
使用df.sort_values(by=, ascending=)通过单个键或多个键对按大小对内容排序
参数:
实例:
# 单个键
data.sort_values(by="open", ascending=True)
# 多个键
data.sort_values(by=['open', 'high'])
使用df.sort_index给索引进行排序
# 对索引进行排序
data.sort_index()
Series排序
使用Series.sort_values(ascending=True)进行排序
# Series排序时,只有一列,不需要参数
data['date'].sort_values(ascending=True)
使用Series.sort_index()进行排序
# 与DataFrame一致
data['date'].sort_index()
df['column'].add(Number)
为某列所有数加上一个数df['column'].sub(Number)
为某列所有数减去一个数逻辑运算符号:
& 逻辑与 | 逻辑或 ~ 逻辑非
> 大于 >= 大于等于 < 小于 <= 小于等于
逻辑运算函数:
query(expression string)
# 用于查询某些内容
data.query("number > 5 & number < 10")
isin(values)
# 可以指定值进行判断,用于进行元素的筛选
data[data["column"].isin([12.5, 40.5])] # 筛选值在 12.5 - 40.5 这个区间内的数据
describe函数:用于数据综合分析,能够直接得出很多统计结果,如count、mean、std、min、max等
data["column"].describe() # 直接输出统计结果
统计函数:
函数 | 介绍 |
---|---|
sum([axis=0]) | 累加求和函数 |
mean([axis=0]) | 求均值函数 |
median([axis=0]) | 求中位数函数 |
min([axis=0]) | 求最小值函数 |
max([axis=0]) | 求最大值函数 |
mode([axis=0]) | 求众数函数 |
abs([axis=0]) | 求绝对值函数 |
prod([axis=0]) | 累乘求积函数 |
std([axis=0]) | 求标准差函数 |
var([axis=0]) | 求方差函数 |
idxmax([axis=0]) | 返回最大值的索引值 |
idxmin([axis=0]) | 返回最小值的索引值 |
**注意:**使用统计函数时需要明确指定axis,也就是轴。当axis=0(默认)时按列统计,axis=1时按行统计
累计统计函数:
函数 | 介绍 |
---|---|
cumsum | 计算前n个项之和 |
cummax | 计算前n个项的最大值 |
cummin | 计算前n个项的最小值 |
cumprod | 计算前n个项的积 |
当Pandas和Numpy内置的函数无法满足业务需求时,需要自定义函数来执行这些特殊的业务逻辑(如某两个列相乘后和第三个列相加……)
# API
df[[column1, column2, ……]].apply(func, axis=0) # 注意:func可传函数名或lambda表达式
# 实例:定义一个某列的最大值减去该列的最小值的函数
data[["col1", "col2"]].apply(lambda x: x.max() - x.min(), axis=0)
写法:DataFrame.plot(kind='str')
参数:kind='str'
, 表示绘图的种类,取值包括:
写法:Series.plot(kind='str')
参数:kind='str'
取值包括:
**注意:**plot函数绘制完图后,需要使用plt.show()才能让图像显示出来,并且需要提前引入matplotlib.pyplot
Pandas支持复杂的IO操作,提供的API支持众多文件格式:
编码类型 | 数据描述 | 读取API | 写入API |
---|---|---|---|
文本 | csv | read_csv | to_csv |
文本 | json | read_json | to_json |
文本 | html | read_html | to_html |
文本 | local clipboard | read_clipboard | to_clipboard |
二进制 | excel | read_excel | to_excel |
二进制 | hdf | read_hdf | to_hdf |
二进制 | fether | read_fether | to_fether |
二进制 | parquet | read_parquet | to_parquet |
二进制 | msgpack | read_msgpack | to_msgpack |
二进制 | stata | read_stata | to_stata |
二进制 | sas | read_sas | |
二进制 | python pickle | read_pickle | to_pickle |
SQL | sql | read_sql | to_sql |
SQL | google big query | read_gbq | to_gbq |
下面介绍几种常用的读写API
# 读取操作
# 指定文件目录和分隔符以及要读取的列,后面两个参数可省略
pandas.read_csv('file_path', sep=',', usecols=['col1', 'col2'])
# 写入操作
# 指定文件目录、分隔符、要写入的列、是否写入列的索引值、是否写入行的索引值、重写'w'或追加'a',以及编码格式,只有文件目录参数不可省略
DataFrame.to_csv('file_path', sep',', columns=None, header=True, index=True, mode='w', encoding=None)
# 读取操作
pandas.read_json('file_path', orient='', typ='', lines=False)
columns: values
形式输出index: {columns: values}
形式输出columns: {index: values}
形式输出# 写入操作
pandas.to_json('file_path', orient='', lines=False) # 参数取值同上
数据离散化就是将大量的数据按照某些等长区间进行划分,然后统计这些数据落在区间内的个数。
API:
# 自行分组(自动分成差不多数量的类别)
qcut = pd.qcut(df['col1'], 10) # 参数: 哪些数据,分几组
# 计算分到每个组数据的个数
qcut.value_counts()
# 自定义区间分组
bins = [1,3,5,7,9,11,13,17,19]
qcut = pd.qcut(df['col1'], bins) # 将自定义的区间传入
qcut.value_counts()
one-hot编码:
# pd.get_dummies(data, prefix=None) # prefix是分组名字
dummies = pd.get_dummies(df['col2'], prefix="Top")
如果你的数据由多张表组成,那么有时候需要将不同的内容合并到一起进行分析
API:
# pd.concat() 实现数据合并
pd.concat([data1, data2], axis=1) # 按行或列进行合并,列0行1
# pd.merge() 实现数据合并
pd.merge(data1, data2, how='inner', on=None) # 类似数据表的连接,left join, right join, innner join, outer join,how指定连接方式(默认内连接),on指定共同的键
交叉表:用于计算一列数据对于另一列数据的分组个数统计(用于统计分组频率的特殊透视表)
API:
pd.crosstab(df['col1'], df['col2']) # 传入相同表的两个不同列,结果是数值
透视表:将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
API:
# data.pivot_table()
DataFrame.pivot_table(['需要统计的列'], index='统计所依照的索引') # 结果是百分比
分组是为了更好的聚合运算
API:
DataFrame.groupby(key, as_index=False)