Pandas
pandas是一款数据处理工具,集成了numpy以及matplotlib,拥有便捷的数据处理以及文件读取能力
核心数据结构
1. DataFrame
numpy仅用作计算,在数据表示方面还有所欠缺,很难从数据上面看出信息表达的含义,在这里我们可以将DataFrame看作是有行列索引(标题)的二维数组
I. DataFrame属性
pd.DataFrame(array, index,columns)
因为pandas是集成了numpy的,属性方面用法和功能都类似
- shape(形状)
- values(除去行列索引后的值)
- T(行列转置)
- index(行索引)
- columns(列索引)
II. 方法
- head(size)——显示前size行数据,默认前五行
- tail(size)——显示后size行数据,默认后五行
import pandas as pd
#二维数组定义
s = [[10,20],[20,30],[30,40]]
#行索引定义
row = ["test{}".format(i+1) for i in range(3)]
#列索引定义
col = ["2019-3-{}".format(i+1) for i in range(2)]
data = pd.DataFrame(s, index=row, columns=col)
#输出
2019-3-1 2019-3-2
test1 10 20
test2 20 30
test3 30 40
III.设置索引
- 修改行列索引值
只能整体修改,不能修改单独某一项
- 重设索引
reset_index(drop=False)
重置索引值,默认drop为False,不删除原索引,将其单独立为一列,在此基础上将索引重置
-
设置新的索引 __
set_index(keys, drop=True)__
- keys:列索引名称或者列索引名称的列表
- drop: boolean,默认为True,当做新的索引,删除原来的列
#设置多个索引
df = pd.DataFrame({'month':[1,4,7,10],'year':[2012,2014,2013,2016],'sale':[55,40,84,31]})
df.set_index(['year', 'month'])#设置之后此时返回的index是MultiIndex类型
#输出
sale
year month
2012 1 55
2014 4 40
2013 7 84
2016 10 31
>>>
IV. MultiIndex
多级或分层索引对象,可用于存放三维数据
- index属性
- names:levels的名称
- levels:每个level的元组值
new_df = df.set_index(['year', 'month'])
new_df.index
new_df.index.names
new_df.index.levels
#输出
----------------------index--------------------------------------------
MultiIndex(levels=[[2012, 2013, 2014, 2016], [1, 4, 7, 10]],
labels=[[0, 2, 1, 3], [0, 1, 2, 3]],
names=['year', 'month'])
----------------------------------------------------------------------------------
----------------------names--------------------------------------------
FrozenList(['year', 'month'])
----------------------------------------------------------------------------------
----------------------levels--------------------------------------------
FrozenList([[2012, 2013, 2014, 2016], [1, 4, 7, 10]])
2. Panel
存放三维数据的面板容器,0.20.0后已经弃用,推荐DataFrame上的MultiIndex方法表示3D数据
I.维度
- items => axis0,每个项目对应内部包含的数据帧(DataFrame)
- major_axis => axis 1,它是每个数据帧(DataFrame)的索引(行)
- minor_axis => axis 2, 它是每个数据帧(DataFrame)的列
3. Series
可理解为带索引的一维数组
I. 属性
- index—— 索引项
- values——索引值,numpy.ndarray类型
II. 创建Series
- 通过已有数据创建
指定内容,默认索引
pd.Series(np.arange(10))
#输出
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
指定索引
pd.Series([6.7,5.6,3,10,2],index=[1,2,3,4,5])
#输出
1 6.7
2 5.6
3 3.0
4 10.0
5 2.0
dtype: float64
- 通过字典数据创建
pd.Series({'red':1000,'blue':100,'green':500,'yellow':200})
#输出
red 1000
blue 100
green 500
yellow 200
dtype: int64
III. 索引操作
data = pd.readcsv('filename.csv')
1)直接索引
必须满足先列后行的规则,data[col][row]
2)按名字索引
new_data = data.locp[索引名,索引名]
或者new_data = data.locp[索引名][索引名]
3)直接按照数字索引
data.iloc[number,number]
4)IX组合索引(数字和名字组合)
data.ix[parm,parm]
- 在进行索引操作的时候,可以结合前面的
index
以及columns.get_indexer
等方法进行数据的获取
IV. 赋值
按照上述索引方法找到对应数据进行赋值即可
V. 排序
1)按照内容排序
sort_values(by=,ascendinf=)
- by:排序关键字,可指定单键或者多建(以列表形式赋给by即可)
- ascending:默认升序,False则降序
2)按照索引排序
sort_index()
- 排序方法对DataFrame以及Series都是适用的,前者需要指定关键字,但是Series的一维数据只需要直接调用方法执行即可。
VI. DataFrame运算
1)算术运算
可以直接用运算符(+、-、*等)或者相应的运算方法(add()、sub()等),作用于数据里面的所有元素
2)逻辑运算
-
逻辑运算符
> (大于) 、 < (小于) 、 &(并且) 、 |(或者)
返回带索引的布尔值,可以用相应的索引方法筛选数据,例如data[data['parm']>2]
,在使用&的时候要注意优先级,不确定的可以用括号包裹 -
逻辑运算函数
- query(expr) —— 按照expr字符串条件查询
- isin(values) —— 判断是否含有values数值,有则返回True,否则返回False
V. 统计运算
max、mean、median、var、std等
,此外可以使用describe()方法统一进行运算,它会自动统计出一些常用运算结果(包含以上内容)
- 这里的idxmax就是类似之前numpy里面的argmax方法获取最大值的位置
VI. 自定义运算
如果需要额外的运算规则,可以自定义一个函数进行统计
apply(func, axis=0)
- func:自定义函数
- axis: 默认为0,计算列,axis=1时对行运算
#自定义一个对列数据最大值减最小值的运算函数
data.apply(lambda x : x.max()-x.min(), axis=0)
pandas画图
image.png文件读取与存储
image.png1. csv操作
I. 读取csv
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, names=, usecols=)
- filepath_or_buffer:文件路径
- usecols:指定读取的列名,列表形式,用作筛选所需要的数据,也可以通过drop函数剔除数据
- names:如果遇到直接就是数据的文件,需要通过names参数手动填入索引项
II. 写入csv
DataFrame.to_csv(path_or_buf=None, sep=',', columns=None, header=True, index=True, index_label=None,mode='w', encoding=None)
- path_or_buf:文件路径
- sep:分隔符
- columns:要保存的列,列表形式
- header:默认为True,是否写进列索引值
- index:是否写进行索引值
- mode:w为重写,a为追加
- series和dataframe操作基本一致
2. HDF5操作
HDF5的存储支持压缩,使用的方式是blosc,速度最快也是pandas默认支持的,可以提高磁盘利用率,节省空间的同时还支持跨平台,可以轻松迁移到hadoop上面,HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame,一个键对应一个DataFrame,也可以相当于是存储三维数据了
I.读取hdf5
读取以及写入需要指定键,不同的键对应不同的DataFrame
pandas.read_hdf(path_or_buf, key=None, **kwargs)
- key:读取的键
- mode:打开文件的方式
II. 写入hdf5文件
可以写入同一个hdf5文件当中,以不同的键区分开来
DataFrame.to_hdf(path_or_buf, key, kwargs)
3. JSON文件操作
I. 读取
pandas.read_json(path_or_buf=None,orient=None,typ='frame',lines=False)
-
orient:指定格式,以下为参数值
- split
- records(最常用的格式,其他了解即可)
- index
- columns
- values
- lines:是否逐行读取,默认为False
- typ:指定转换成的对象类型,series或者dataframe,默认为frame
2. 写入
pandas.to_json(path_or_buf=None,orient=None,typ='frame',lines=False)