19.1安装Anaconda
Anaconda是Python的一个开源发行版本,它预装了丰富的第三方库,而且主要面向科学计算和数据分析,使用起来要比原版的Python更省时省力。
Anaconda官方下载网址为:https://www.continuum.io/downloads。下载和安装的方法很简单,若有问题可以在网上搜索相关内容学习解决。
安装Anaconda之后,就会发现在Anaconda目录下同时安装了Jupyter Notebook、Spyder等工具,我们接下来主要使用Spyder进行开发。关于Spyder的使用方法非常简单,大家也可以去网上搜索学习。
虽然Anaconda已经预装了很多常用的包,但有时我们也需要自己安装一些包。可以在开始菜单中选择“Anaconda Anaconda Prompt”命令,在命令行输入conda install ( 代表包名)即可安装,也可以输入pip install 。
19.2数据分析包Pandas
Pandas是Python的一个数据分析包,Anaconda安装时已经附带安装了Pandas包。
Pandas数据结构有三种:Series(一维数组)、DataFrame(二维数组)和Panel(三维数组),其中最常用的是前两种数据结构。
19.2.1 Series
Series(序列)用于存储一行或一列数据,以及与之相关的索引的集合。
语法格式如下:
Series([数据1,数据2,......], index=[索引1,索引2,......])
例:
from pandas import Series
s=Series(['张三','李四','王五'],index=[1,2,3])
print(s)
输出结果如下:
1 张三
2 李四
3 王五
dtype: object
上面建立序列时指定了索引,若不指定,则默认的索引值从0开始。如下:
s=Series(['张三','李四','王五'])
输出结果为:
0 张三
1 李四
2 王五
dtype: object
索引值也可以为字符串。如下:
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
print(s)
输出结果为:
A 张三
B 李四
C 王五
dtype: object
1、访问序列
(1)可以通过索引访问序列,如:
from pandas import Series
s=Series(['张三','李四','王五'])
print(s)
print(s[0])
print(s[1:])
运行结果如下:
0 张三
1 李四
2 王五
dtype: object #print(s)输出
张三 #print(s[0])输出
1 李四
2 王五
dtype: object #print(s[1:])输出
(2)通过值获取索引值
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
print(s.index[s.values=='李四'])
运行结果:
Index(['B'], dtype='object')
(3)判断值是否存在
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
f='李四' in s.values
print(f)
运行结果:
True
(4)定位获取
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
print(s[[0,2,1]])
运行结果:
A 张三
C 王五
B 李四
dtype: object
2、修改序列
(1)追加序列,如:
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
s1=Series(['孙六'],index=['D'])
s=s.append(s1)
print(s)
运行结果:
A 张三
B 李四
C 王五
D 孙六
dtype: object
(2)修改序列的值
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s[1]='李飞'
print(s)
运行结果:
A 张三
B 李飞
C 王五
D 孙六
dtype: object
不知道索引,仅知道要修改的值,也可通过值查找到索引后,再修改序列的值。如:
s[s.index[s.values=='李四']]='李飞'
这样也可以将“李四”修改为“李飞。
(3)修改索引
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s.index=[0,1,2,3]
print(s)
运行结果:
0 张三
1 李四
2 王五
3 孙六
dtype: object
(4)删除元素
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s=s.drop('A')
print(s)
运行结果:
B 李四
C 王五
D 孙六
dtype: object
(5)重新排序
可以按照索引排序,使用sort_index(ascending=True)方法对index进行排序 *** 作。
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s=s.sort_index(ascending=False) # ascending=False表示按降序排列
print(s)
运行结果:
D 孙六
C 王五
B 李四
A 张三
dtype: object
(6)重置索引
重置索引可以使用reindex()。如果index列表中的元素多于序列的值,可用fill_value=0这样的语句填充。
s=s.reindex(['D','C','B','A'])
如果index列表中的元素多于序列的值,可用fill_value=0这样的语句填充。
s=s.reindex(['D','C','B','A'], fill_value=0)
19.2.2 DataFrame
DataFrame(数据框架)用于存储多行和多列的数据集合。它是Series的容器,类似于Excel中二维表格。
定义一个DataFrame的语法格式如下:
df=DataFrame({列名1 : 序列1,列名2 : 序列2,.......列名n : 序列n}, index=序列 )
例如,有如下二维表:
姓名
年龄
张三
男
18
李四
女
19
王五
男
17
保存到DataFrame中可以用如下方法:
from pandas import Series
from pandas import DataFrame
name=Series(['张三','李四','王五'])
sex=Series(['男','女','男'])
age=Series([18,19,17])
df=DataFrame({'姓名':name,'性别':sex,'年龄':age})
print(df)
运行结果:
姓名 性别 年龄
0 张三 男 18
1 李四 女 19
2 王五 男 17
从上例可以看出,虽然我们省缺了索引,但系统自动添加了从0开始的索引值。
19.3 DataFrame的基本 *** 作
1、访问方式
(1)获取行
print(df[1:2]) # 获取第1行的值
输出结果:
姓名 性别 年龄
1 李四 女 19
print(df[1:3]) #获取第1行到第2行的值
输出结果:
姓名 性别 年龄
1 李四 女 19
2 王五 男 17
(2)获取列
print(df['姓名']) #获取“姓名”列的值
输出结果:
0 张三
1 李四
2 王五
Name: 姓名, dtype: object
另一种方法:
print(df[df.columns[0:1]]) #先按照索引号获取列名,再按照列名读取
输出结果和上面的方法完全一致。
还有一种情况,是获取唯一值,即将列内的重复值中多余的删除,仅留下互不相同的值。所用的到方法是unique()。
sex1=Series(df['性别'].unique())
print(sex1)
输出结果:
0 男
1 女
dtype: object
(3)获取指定位置的值
print(df.at[1,'姓名']) # 格式为变量名.at[行号,列名]
输出结果:
李四
(4)获取块的值
print(df.iloc[0:2,1:3]) # 格式为变量名.iloc[行号1:行号2, 列号1:列号2]
输出结果:
性别 年龄
0 男 18
1 女 19
print(df.iloc[:,1:2]) #获取“性别”列的值
运行结果:
性别
0 男
1 女
2 男
2、修改、删除、增加行和列
(1)修改列名
print(df.columns)
df.columns=['name','sex','age']
print(df.columns)
输出结果:
Index(['姓名', '性别', '年龄'], dtype='object')
Index(['name', 'sex', 'age'], dtype='object')
可见,列名已经由“姓名、性别、年龄”修改为“age、sex、age”了。但这种修改必须把全部列名都一一列举,不能有遗漏,否则就会出错。如:
df.columns=['name','sex']
此时会报错:ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements。
(2)修改行索引
df.index=[1,2,3]
(3)删除行
df.drop(1,axis=0) # axis=0表示行轴,也可以省略
(4)删除列
df.drop(‘性别’,axis=1) # axis=0表示列轴
也可以使用另一种方法:
del df['性别']
(5)增加列
df['电话']=['1111111','2222222','3333333']
print(df)
运行结果:
姓名 性别 年龄 电话
0 张三 男 18 1111111
1 李四 女 19 2222222
2 王五 男 17 3333333
(6)增加行
df.loc[len(df)]=['孙六','男','20']
(7)追加
from pandas import Series
from pandas import DataFrame
name=Series(['张三','李四','王五'])
sex=Series(['男','女','男'])
age=Series([18,19,17])
df=DataFrame({'姓名':name,'性别':sex,'年龄':age}) # 建立DataFrame,变量名为df
name1=Series(['孙六','候七'])
sex1=Series(['男','女'])
age1=Series([19,17])
df1=DataFrame({'姓名':name1,'性别':sex1,'年龄':age1})
# 建立DataFrame,变量名为df1
df=df.append(df1,ignore_index=True)
# 将对df1追加到df后面,参数ignore_index=True表示重新索引
print(df)
运行结果:
姓名 性别 年龄
0 张三 男 18
1 李四 女 19
2 王五 男 17
3 孙六 男 19
4 候七 女 17
pd.Series 主要设置两个参数,data 和 index,如果不设置 index,则 index 从 0 开始递增。除此之外,还可以设置 dtype。
除了直接设置各个字段,还可以将字典作为参数传入,series 会自动将 key 作为 index,将 value 作为 data。
为了保证数据存取的效率,series 的 index 必须是可哈希的。
series 和字典一样,索引和修改的时间复杂度为 。它有两种索引方式,第一种索引方式与字典相同,但强烈不推荐,会导致各种副作用:
在某些情况下,它会产生歧义:
第二种索引方式是采用 .loc 方法,这种写法是推荐的:
注意一个细节:利用 index 做切片时,和 list 或者 array 利用下标切片,不包括末尾元素不同,index 切片是包括 end 元素的。
除了利用 index 切片,Series 也可以用下标切片,此时不包括终点下标对应的元素,表现和 python 惯例一致:
不像字典的 key 是唯一的,Series 支持 index 包含重复元素。但对 Series 做切片时,如果重复的 index 不是相邻的,则会报错:"Cannot get left\right slice bound for non-unique label: 'xxx' "。
因此强烈建议先对 index 排序,这样可以保证切片能够一直能正确运行,并且还能提高索引的效率。
和 numpy 一样,Series 也支持高级索引:
两个 Series 可以相加,只有相同 label 的数据会相加,只存在于其中一个 Series 的数据相加后为 NaN,但也可以指定一方缺失的 label 对应的默认值:
需要注意的是,在 *** 作过程中, series value 的数据类型可能会隐式地被改变,如果不注意,很有可能影响增删的效率,甚至产生错误的结果。
影响效率的例子:
产生错误结果的例子:
DataFrame 还支持广播功能:
可以将 DataFrame 保存为 csv 文件或 json 文件
包括一系列函数:
p.describe() 默认只显示数字列,但也可以设置参数 include='all' 现实所有列。
p.loc['sonia'] 展示 sonia 行
p.loc['sonia', 'age'] 只显示 sonia 的年龄
筛选出女性条目:
增加年龄筛选条件:
DataFrame.mean() 可以按列计算平均值
几种不建议的写法:
p.drop(columns=['mean', ], inplace=True) 用于删除一列或多列, inplace 作用是,设置是否修改原来的 p,如果True,返回 None,原 p 被修改,如果 False,返回被修改后的 DataFrame,同时原 p 保留。
DataFrame 支持所有 numpy 的函数,numpy 函数可以直接施加在 DataFrame 上,例如:
但是,如果需要用到 DataFrame 的 label 对齐特性,例如两个 index 顺序并不相同的 DataFrame 相加,那么 numpy 的函数将直接计算中间的 values,而不会考虑它们 label 对齐的问题。(该问题已经在 pandas 0.2.5 中被修正)
运算中设置 fill_value 可以让表中缺失的数据被 fill_value 代替。
当一个 Series 和一个 DataFrame 相加时,pandas 会默认 Series 是一行,并把它广播到其它行。Series 的 index 会被对应到 DataFrame 的列上,并对齐。如果 Series 的 index 与 DataFrame 的列没关系,那么会扩增 DataFrame,扩增区域对应的数据为 NaN。如果想让 Series 的 index 和 DataFrame 的index 对应,则需要指定 axis=0:
在构建 pandas Series 或者 DataFrame 时,有两种方式可以表示 NaN,一种是 np.NaN ,另一种是python 的 None 对象。 np.NaN 的数据类型是 float ,因此,在 pandas 中,存在 NaN 的对象要么是 float64 的,要么是 object 类型。
pandas 利用如下方法处理缺失数据:
MultiIndex 适用于数组大于二维的情况。所有可以用 Index 的地方,都可以用 MultiIndex 。
MultiIndex Series
MultiIndex DataFrame 利用 from_product 可以方便地创建 MultiIndex。
MultiIndex DataFrame 的索引十分方便
元组配合 slice ,为 MultiIndex DataFrame 做切片:
concat 用于将两个表拼接起来,它适用于两个表有相同的 index 或者有相同的 columns。
concat 也适用于拼接 Series,但是不论是 DataFrame 还是 Series,它不会检查各行的 index 是否重复。
一个解决方案是设置 verify_integrity 参数,它会在遇到两个相同 index 的时候报错。但是这无疑会导致额外的计算,因此除非确实必要,一般不设置它。
设置拼接参数
merge 适用于两个表某 列 相同,然后所有的融合都基于该列:
merge 默认采取 inner join 的策略,如果以某列为基准,那么最终结果中,只有同时出现在这两列中的数据被保留。
总共有三种merge 的方式:
merge 可以设置 on= 或者 left_on= 、 right_on= 显式指定基准列
当两表中的基准列元素不完全一致时,通过设置 how 有四种 merge 策略:
groupby 按照某个指标聚类,分别计算各类数据
groupby 返回值的属性:
groupby 方法分发。 groupby 返回的对象如果没有实现某个 DataFrame的方法,该对象仍然可以调用,只不过是遍历每个类别,分别调用。
groupby().agg 方法:agg 中以 list/dict 形式传入函数名(或名字的字符串),计算每个组的统计量。
groupby().filter() filter 内传入筛选条件,可以是 lambda 表达式
groupby().transform() transform 内传入变换函数,如 lambda 表达式,变换函数将施加在每个子 group 上,一个经典用例是用它来对每个 group 内部中心化,或者用group 均值代替其中的 NaN。
以 titanic 的例子,我们希望得到这样的表格:有三行,每行代表一个舱位级别;有两列,每列代表一个性别。此时需要用到 pivot_table 。 pivot_table 相当于把 groupby 的结果表示为二维表格。
numpy 和 pandas 可以很好地处理各种格式的时间字符串,将其转化为标准格式。同时提供了一系列方法,对时间序列求区间、采样等等。
本节课将讲解Pandas-Series的重塑(Reshaping)与排序(sorting)。
重塑顾名思义即改变数据的形状。
首先导入所需依赖包
对value排序,返回一个新的Series,新Series的值是排序后的原value在原Series中的整数位置,NaN的位置为-1。(有点绕,通过下面例子图解会比较清晰易懂)
图解argsort:
返回Series中最小值的整数位置。
与Series.idxmin()比较: argmin返回的是最小值的整数位置,idxmin返回的是最小值的索引 。
返回Series中最大值的整数位置。
与Series.idxmax()比较: argmax返回的是最大值的整数位置,idxmax返回的是最大值的索引 。
使用输入顺序重新排列索引级别。重新排序MultiIndex的级别。
按值对Series排序。
按索引标签对Series进行排序。
MultiIndex的i级索引和j级索引交换位置。
数据透视,使用MultiIndex Series生成DataFrame。
将类似列表的每个元素转换为行,这些行的索引将重复。
插入元素应在的位置,插入点,原理应该是二分查找。
注意⚠️:Series必须单调排序,即Series必须是已经排好序的。
返回一个展平的ndarray。
重复Series的元素。
返回一个新Series,其中每个元素都连续重复给定次数。
具有单个元素的Series或DataFrames被压缩为标量。具有单列或单行的DataFrame被压缩为Series。否则,对象不变(感觉这个方法用处不大,可以用loc代替)。
创建一个Series的新视图。
注意⚠️:新视图值的修改会影响到原Series。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)