Pandas
1)Pandas介绍
- 2008年WesMcKinney开发出的库
- 专门用于数据挖掘的开源python库
- 以Numpy为基础,借力Numpy模块在计算方面性能高的优势
- 基于matplotlib,能够简便的画图
- 独特的数据结构
2)Pandas的优势
- 增强图表的可读性
- 便捷的数据处理能力
- 读取文件方便
- 封装了Matplptlib、Numpy的画图和计算
3)Pandas的数据结构
Pandas中义工有三种数据结果,分别为:Series、DataFrame和MultiIndex
其中Series是一维数据结果,DataFrame是二维的表格型结构,MultiIndex是三维的数据结构。
1.Series
Series是一个类似于一维数组的数据结果,它能够保存任何类型的数据,比如整数、字符串、负端数等。主要由一组数据和之相关的索引两部分构成。
1.1Series的创建
# 导入pandas
import pandas as pd
pd.Series(data=None, index=None,dtype=None)
-
参数:
- data 传入的数据
- index 索引,必须是唯一的,切与数据的长度相等,如果没有传入索引参数,则默认会自动创建一个从0到N的整数索引
- dtype 整数的类型
-
指定内容,默认索引
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 dtype: int64
-
指定索引
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
-
通过字典数据创建
color_count = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000}) color_count # 运行结果 blue 200 green 500 red 100 yellow 1000 dtype: int64
1.2 Series的属性
为了更方便的操作Series对象中的索引和数据,Series中提供了两个属性index和value
- index
color_count.index
# 结果
Index(['blue', 'green', 'red', 'yellow'], dtype='object')
- values
color_count.values
# 结果
array([ 200, 500, 100, 1000])
也可以使用索引来获取数据:
color_count[3]
# 结果
1000
2.DataFrame
DataFrame是一个类似于二维数组或表格的对象,既有行索引,又有列索引。
- 行索引,表明不同行,横向索引,叫index,0轴,axis=0
- 列索引,表明不同列,总想索引,叫columns,1轴,axis=1
2.1 DataFrame的创建
# 导入pandas
import pandas as pd
pd.DataFrame(data=None,index=None,columns=None)
- 参数
- index:行标签,如果没有传入,默认自动创建0-N的整数索引
- columns:列标签,如果没有传入,默认自动创建0-N的整数索引
- 通过已有数据创建
创建学生成绩表
# 生成10名同学,5门功课的数据
score = np.random.randint(40, 100, (10, 5))
# 结果
array([[92, 55, 78, 50, 50],
[71, 76, 50, 48, 96],
[45, 84, 78, 51, 68],
[81, 91, 56, 54, 76],
[86, 66, 77, 67, 95],
[46, 86, 56, 61, 99],
[46, 95, 44, 46, 56],
[80, 50, 45, 65, 57],
[41, 93, 90, 41, 97],
[65, 83, 57, 57, 40]])
但是这样的数据形式很难看到存储的是什么的样的数据,可读性比较差!!
问题:如何让数据更有意义的显示?
# 使用Pandas中的数据结构
score_df = pd.DataFrame(score)
增加行、列索引
# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 构造列索引序列
students = ['同学{}'.format(i) for i in range(5)]
# 添加索引
data = pd.DataFrame(score, index = students, columns = subjects)
2.2 DataFrame的属性
- shape 获取形状
- index 获取行索引列表
- columns 获取劣索引列表
- values 获取值
- T 行列转换
- head() 默认显示前5行内容,可加入参数
- tail() 默认显示后5行内容,可加入参数
2.3 修改行列索引值
- 必须整体修改
stu = ["学生_" + str(i) for i in range(score_df.shape[0])]
# 必须整体全部修改
data.index = stu
-
重设索引
- reset_index(drop=False)
- 设置新的下标索引
- drop默认为False,不删除原索引,如果为True,删除原索引
# 重置索引,drop = False data.reset_index() # 重置索引,drop = True data.reset_index(drop=True)
- reset_index(drop=False)
-
将某列值设置为新的索引
- set_index(keys,drop=True)
- keys:列索引名或列索引名称的列表
- drop:默认为False,不删除原索引,如果为True,删除原索引
df = pd.DataFrame({'month': [1, 4, 7, 10], 'year': [2012, 2014, 2013, 2014], 'sale':[55, 40, 84, 31]}) month sale year 0 1 55 2012 1 4 40 2014 2 7 84 2013 3 10 31 2014
2、以月份设置新的索引
df.set_index('month') sale year month 1 55 2012 4 40 2014 7 84 2013 10 31 2014
3、设置多个索引,以年和月份
df = df.set_index(['year', 'month']) df sale year month 2012 1 55 2014 4 40 2013 7 84 2014 10 31
- set_index(keys,drop=True)
3.MultiIndex与Panel
3.1 MultiIndex是三维的数据结构
多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有两个以及以上的索引。
3.2 multiIndex特性
打印刚才的dj的行索引结果
df.index
MultiIndex(levels=[[2012, 2013, 2014], [1, 4, 7, 10]],
labels=[[0, 2, 1, 2], [0, 1, 2, 3]],
names=['year', 'month'])
多级或分层索引对象
-
index属性
- names : levels的名称
- levles:每个level的元组值
df.index.names # FrozenList(['year','month']) df.index.levels # frozenList([[1,2],[1,4,7,10]])
3.3 multiIndex的创建
arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
pd.MultiIndex.from_arrays(arrays,names=('number','color'))
# 结果
MultiIndex(levels=[[1, 2], ['blue', 'red']],
codes=[[0, 0, 1, 1], [1, 0, 1, 0]],
names=['number', 'color'])
3.4 Panel的创建
-
pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None)
- 作用:存储三维数组的Panel结构
- 参数:
- data:ndarray或者dataframe
- items:索引或类似数组的对象,axis=0
- major_axis:索引或类似数组的对象,axis=1
- minor_axis:索引或类似数组的对象,axis=2
p = pd.Panel(data=np.arange(24).reshape(4,3,2), items=list('ABCD'), major_axis=pd.data_range('20191014',periods=3), minor_axis=['first','second']) # 结果 <class 'pandas.core.panel.Panel'> Dimensions: 4 (items) x 3 (major_axis) x 2 (minor_axis) Items axis: A to D Major_axis axis: 2019-10-14 00:00:00 to 2019-10-17 00:00:00 Minor_axis axis: first to second
3.5 查看Panel数据
p[:,:,'first']
p['B',:,:]
4)基本数据操作
1.索引操作
1.1 直接使用行列索引(先列后行)
# 直接使用行列索引名字的方式(先列后行)
data['xx']['1']
1.2结合loc或者iloc使用索引
data.loc['xx':'xx-1','1']
data.iloc[:3,:5]
1.3使用ix组合索引
例如:获取行第一天到第四天,[‘a’,‘b’,‘c’,‘d’]这四个指标的结果
# 使用ix进行下标和名称组合索引
data.ix[0:4,['a','b','c','d']]
# 推荐使用loc和iloc的方式来获取
data.loc[data.index[0:4],['a','b','c','d']]
data.iloc[0:4,data.columns.get_indexer(['a','b','c','d'])]
2.赋值操作
对DataFrame当中的b列进行重新赋值为1
# 直接的修改原来的值
data['b'] = 1
# 或者
data.b = 1
3.排序操作
排序有两种形式,一种是对索引进行排序,另一种是对内容进行排序
3.1 DataFrame排序
- 使用df.sort_values(by=,ascending=)
- 单键或者多键进行排序,默认升序
- ascending=False降序
- asending=True升序
data = data.sort_values(by='a',ascending=True).head()
data = data.sort_index()
3.2 Series排序
- 使用df.sort_values(ascending=)
- series排序只有一列,所以不需要参数
data['b'].sort_values(ascending=True).head()
data['b'].sort_index().head()
5)DataFrame运算
1.算术运算
- add(other)
data['abc'].add(1)
- sub(other)
2.逻辑运算
2.1 逻辑运算符号
-
例如筛选data[‘abc’] > 22 的日期数据
- 会返回逻辑结果
data['abc'] > 23 # 结果: 2018-02-27 True 2018-02-26 False 2018-02-23 False 2018-02-22 False 2018-02-14 False
- 逻辑判断的结果可以作为筛选的依据
data[data['abc'] > 23].head() # 结果就是 data数据中abc列 大于23的前五条数据
-
完成多个逻辑判断
data[data'abc'] > 23 ) & (data['abc'] < 26).head() # 结果就是 data数据中abc列大于23并且小于26的前五条数据
2.2 逻辑运算函数
-
query(expr)
- expr:查询字符串
通过query可以使刚才的运算更加方便简单
data.query("abc > 23 & abc < 27").head()
-
isin(values)
例如判断’abc’是否为11和22
# 可以指定值进行判断,从而筛选结果 data[data['abc'].isin([11,22])]
3.统计运算
3.1 直接得出很多统计结果
-
describe
综合分析:能够直接得出很多统计结果,例如count,mean,std,min,max等
# 计算平均值、标准差、最大值和最小值等 data.describe()
3.2 统计函数
count | Number of non-NA observations |
---|---|
sum | Sum of values |
mean | Mean of values |
median | Arithmetic median of values |
min | Minimum |
max | Maximum |
mode | Mode |
abs | Absolute Value |
prod | Product of values |
std | Bessel-corrected sample standard deviation |
var | Unbiased variance |
idxmax | compute the index labels with the maximum |
idxmin | compute the index labels with the minimum |
注意:对于单个函数去进行统计的时候,坐标轴还是按照默认列"columns"(axis=0,default),如果要对行"index",需要指定(axis=1)
-
max()、min()
# 求出各列的最大值 data.max() # 求出各行的最小值 data.min(1)
-
std()、var()
# 求出各列的方差 data.std() # 求出各行的标准差 data.var(0)
-
median()
中位数为将数据从小到大排序,在最中间的那个数为中位数。如果没有中位数,取中间两个数的平均值。
data = pd.DataFrame({'demo1' : [2,3,4,5,4,2], 'demo2' : [0,1,2,3,4,2]}) # 求出data的中位数 data.median() # 结果 demo1 3.5 demo2 2.0 dtype: float64
-
idxmax()、idxmin()
# 求出最大值的位置 data.idxmax() # 求出最小值的位置 data.idxmin()
3.3 累计统计函数
函数 | 作用 |
---|---|
cumsum | 计算前1/2/3/…/n个数的和 |
cummax | 计算前1/2/3/…/n个数的最大值 |
cummin | 计算前1/2/3/…/n个数的最小值 |
cumprod | 计算前1/2/3/…/n个数的积 |
- 排序
# 排序之后进行累计求和
data = data.sort_index()
# 对'abc'列进行求和
sum_ = data['abc'].cumsum()
# 如果需要使用plot函数,可以导入matplotlib
import matplotlib.pyplot as plt
sum_.plot()
plt.show()
4.自定义运算
- aaply(func,axis=0)
- func :是自己定义的函数
- axis = 0 :默认是列,1的时候为行
- 定义一个队列,最大值 - 最小值的函数
data[['abc','dfg']].apply(lambda x : x.max() - x.min(), axis=0)