Pandas模块
Pandas简介
pandas是用于对数据进行分析,其需要依赖numpy模块,所以需要首先安装numpy
安装:pip install pandas
导入:import pandas as pd
主要功能:
1、具备对其功能的数据结构DataFrame、Series(即两种对象,其实有更多)
2、集成时间序列功能
3、提供丰富的数学运算和操作
4、灵活处理缺失数据
Series对象
Series对象是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成,好像是字典和列表的结合体
创建
方式一、pd.Series(列表或数组{,index=[列表]})
sr = pd.Series([1, 3, 5, 7, 9]) """ 0 1 1 3 2 5 3 7 4 9 """ sr = pd.Series([1, 3, 5, 7, 9], index=list(‘abcde‘)) """ a 1 b 3 c 5 d 7 e 9 dtype: int64 """
方式二、pd.Series(字典)
sr = pd.Series({‘a‘: 1, ‘b‘: 3, ‘c‘: 5, ‘d‘: 7, ‘e‘: 9}) """ a 1 b 3 c 5 d 7 e 9 dtype: int64 """
取对应下标或标签的值
sr = pd.Series({‘a‘: 1, ‘b‘: 3, ‘c‘: 5, ‘d‘: 7, ‘e‘: 9}) """ a 1 b 3 c 5 d 7 e 9 dtype: int64 """ # 可按下标取值 print(sr[0]) # 1 # 如指定了标签,则可使用标签,字典的key print(sr[‘c‘]) # 5
属性
index属性和values属性
# index属性 sr = pd.Series({‘a‘: 1, ‘b‘: 3, ‘c‘: 5, ‘d‘: 7, ‘e‘: 9}) print(sr.index) # Index([‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘], dtype=‘object‘)
# values属性 sr = pd.Series({‘a‘: 1, ‘b‘: 3, ‘c‘: 5, ‘d‘: 7, ‘e‘: 9}) print(sr.values) # [1 3 5 7 9]
iloc属性:指定用下标索引
loc属性:标签索引
Series特性
数组的特性
Series支持数组(numpy)的特性,如与数值的计算、两个Series的运算,索引、切片、通用函数(如np.sqrt(sr))、布尔值过滤、统计函数
字典的特性
1、in运算:
‘a‘ in sr:判断a是不是sr的标签之一
for x in sr:这里注意,python循环的是字典的键,而在Series中循环的是sr的值
sr = pd.Series({‘a‘: 1, ‘b‘: 3, ‘c‘: 5, ‘d‘: 7, ‘e‘: 9}) for x in sr: print(x) """ 1 3 5 7 9 """ # 如果要循环标签,可加上index,如下: for x in sr.index: print(x) """ a b c d e """
2、键索引:sr[‘a‘]、sr[[‘a‘, ‘b‘, ‘e‘]]
3、键切片:sr[‘a‘:‘c‘],注意python字典切片是不包尾,但在Series切片是包尾的
sr = pd.Series({‘a‘: 1, ‘b‘: 3, ‘c‘: 5, ‘d‘: 7, ‘e‘: 9}) print(sr[‘a‘: ‘c‘]) """ a 1 b 3 c 5 """
4、get函数:与字典的get是类似的sr.get(‘a‘, default=0)
整数索引
以下情况:
sr1 = pd.Series([1, 3, 5, 7, 9, 11]) sr2 = sr1[2:5] """ 2 5 3 7 4 9 """
那么sr2[2]是按下标索引还是标签索引?下面做了个测试
print(sr2[2]) # 5
得出了是按标签索引,所以默认是按标签索引,而如果要指定是按下标索引怎么办呢?用到iloc属性,如下:
print(sr2.iloc[2]) # 9
也可指定用标签索引,用loc属性
print(sr2.loc[2]) # 5
数据对齐
Series之间进行运算,是根据相同标签查找的值进行运算,如下:
# 按标签进行运算,不是按下标运算 sr1 = pd.Series([12, 23, 34], index=list(‘cad‘)) sr2 = pd.Series([11, 20, 10], index=list(‘dca‘)) sr3 = sr1 + sr2 """ a 33 c 32 d 45 """
如果找不到对应的下标,则会用NaN标记,如下:
sr1 = pd.Series([12, 23, 34], index=list(‘cae‘)) sr2 = pd.Series([11, 20, 10], index=list(‘dca‘)) sr3 = sr1 + sr2 """ a 33.0 c 32.0 d NaN e NaN """
如果需要在缺失的数据上填上默认值怎么办呢?那这时候进行运算时就需要用到add、sub、div、mul等运算的fill_value,例子如下:
sr1 = pd.Series([12, 23, 34], index=list(‘cae‘)) sr2 = pd.Series([11, 20, 10], index=list(‘dca‘)) print(sr1.add(sr2, fill_value=0)) """ a 33.0 c 32.0 d 11.0 e 34.0 """
缺失数据的处理
1、sr.dropno():把Series中标记为NaN的数据丢弃
sr1 = pd.Series([12, 23, 34], index=list(‘cae‘)) sr2 = pd.Series([11, 20, 10], index=list(‘dca‘)) sr3 = sr1 + sr2 print(sr3.dropna()) """ a 33.0 c 32.0 """
2、sr.fillna(值):填充一个值
3、sr.isnull():返回一个布尔数组,缺失值对应为True
sr1 = pd.Series([12, 23, 34], index=list(‘cae‘)) sr2 = pd.Series([11, 20, 10], index=list(‘dca‘)) sr3 = sr1 + sr2 """ a False c False d True e True """
4、sr.notnull():返回一个布尔数值,缺失值对应为False
注意:panads一般需要重新赋值才可以继续使用,不赋值那还是原来的值???