写在前面:

大家好!我是Kindombo。很久之前,我就想写一系列关于Python数据分析的文章,一方面,当今我们已进入大数据时代,对数据的把控并参透其背后的规律对企业,国家都有着巨大的价值。而随着时代的转型,传统企业的主要业务也将从业务需求逐渐转向数据驱动业务,我坚信,未来必将是大数据的时代!而作为如今的我们,掌握数据分析这项技能更将成为个人的核心竞争力之一。哈哈,说了这么多废话,我还是好好说我准备这个专栏的看法,首先,我写这个专栏文章的目的肯定首要的是让大家都掌握(至少认真看过我写的文章,并实操的伙伴)Python数据分析这项基本技能。除此之外在写这系列文章的时候,我想我将会以一种全新的视角写这系列的文章,(保证绝对不是填鸭式的写作)。希望能够给各位小伙伴以思想启迪。具体我将融合我所学其他科目的综合思维(嘿嘿,具体请看后面慢慢道来),总之,好好学下来,你一定不会后悔!

具体来说说这个专栏的目标:

对于计算机相关专业:

全面掌握Python数据分析技巧及思想(并掌握若干Python知识)

全面掌握Python面向对象调用函数的思想,并能推而广之(运用这些思想去学C++,Java等语言)

掌握若干数学建模思想

训练系统思维,整体布局能力得到全面提升。

领略从数据分析结果洞察趋势的思想并训练数据驱动业务的能力

对于经济学相关专业:

熟练掌握利用Python分析问题的能力

领略Python面向对象之美

训练系统分析思维

培养金融相关数据的敏感性,增强就业竞争力

对于其余专业:

学会Python如何解决实际问题

领会Python之美,见识Python的威力

领略相关计算思想和计算机系统思维

训练系统思维,提升认知

多说一句,鄙人认为以上最重要的是,对我而言,是系统思维,把控大局的能力!这是我近期一直在努力培养的能力,但我觉得可能短时间内难以达成,但是我将持续为之而努力!!!好啦,废话不多说,万丈高楼平地起,让我们正式开始吧!

Series对象

好啦!现在时间是2021年3月8日凌晨1:56分,让我们先来看Series对象。首先,要进行数据分析,我们的首先问题是,掌握一些必要的工具。其实可以将数据分析看成是挖土,哈哈,那么锄头就是你的工具,利用它你可以对泥土进行挖掘、翻盖等操作。嘿嘿,那么,对于数据分析而言,它的其中一个工具就是Series,但是这个工具就牛逼了,它不仅可以实现对数据的存储,还可以对数据的各种读取操作和简单的运算,也就是对数据实现存储和加工。哈哈,那么Series对象到底是什么呢?(这里的对象可不是npy哈,想起之前一男孩对着他npy讲面向对象编程(莫名心酸。。。)哈哈)别急,且听我慢慢道来。在这里,可能有相当一部分同学没有接触过面向对象编程,你可以暂时把Series对象看成是人,大象之类的实体。那么既然他是实体,那么他就有相应的属性和动作。(就比如人你总是要吃饭,干各种事儿的吧。。。人当然还有美女啊啥的,这些我们将它称作人的属性)于是乎,对于Series也有一些属性和动作(方法),由于它是操作数据对象的,因此它的属性和方法也将和数据有关。以下我将正式介绍它的相关用法和注意事项。干货来了!接住!

1.如何生成Series对象?

首先我们需要导入一个包,这个包叫做Pandas(可不是大熊猫哈,虽然我很想这样叫,想想熊猫也可以做数据分析,多牛逼!)OK,对于包你可能不太理解,这里你可以把它想成是一个大仓库,这个仓库主要的功能是数据分析相关操作,现在我们就在这个仓库里取出Series这个工具来进行相关操作。

代码如下:

import pandas as pd
x=pd.Series([1,2,3,4]) #从列表创建Series对象,索引方式为下标和index
x

如上图所示,我们借助一维数组生成了一个Series对象,并打印x的结果。如下图:

怎么取出series对象中value最大值_python

可以看到结果是1,2,3,4;并且自动生成了标签,(和数组规则类似)。那么Series和数组有啥区别嘞?ok,Series不仅可以利用下标进行索引,还可以自己定义索引并对其元素对象进行引用。比如:

sr=pd.Series([1,2,3,4,5],index=['a','b','c','d','e']) #访问特性
sr

这里我们首先利用数组生成了一个Series对象,并自己给它定义了标签值,打印sr,结果见下图:

怎么取出series对象中value最大值_python_02

嘿嘿,怎么样?牛逼吧!进一步,我们用更规范的语言来定义Series对象,它其实是列表和字典的结合体,嘿嘿,这里体现了更高级的抽象层次(get到了吗?)那么,我们自然还可以通过字典来创建Series对象,如下所示:

#字典特性
sr1=pd.Series({'a':1,'b':2}) #通过字典创建Series对象
print(sr1)

输出结果为:

怎么取出series对象中value最大值_数据分析_03

好啦,现在让我们来分别使用下标和标签看一下结果。

print(sr[0]) #用下标访问值
print(sr['a']) #用索引访问值

打印结果为:

怎么取出series对象中value最大值_数据_04

嘿嘿!了解了吗?不过Series可不仅仅支持以上索引方式,它还支持切片呢!让我们来看看,假如我们想获取Series的前三个元素值,我们可以这样:

print(sr[0])
print(sr[[0,1,2]])  #索引方式
print(sr[0:3]) #切片

打印结果为:

怎么取出series对象中value最大值_数据分析_05

可以看到它把前三个数的键、值都打印出来了。这样我们就可以实现对数据的连续截取工作。但是,假如我们想单独获取它的索引和值,我们该怎么做呢?

#分别获取索引和值
print(sr.index)  #获取索引
print(sr.values) #获取值

结果为:

怎么取出series对象中value最大值_数据_06

看到了吧,我们只需要调用sr对象的index和values方法就可得到它的标签和值。这对一些只关注值的情况下尤为有用。那么,除了这种单独获得值的方式外,我们还可以怎样获得它的值呢,for循环!看一下代码:

for i in sr:
    print(i) #打印结果与字典不同,字典打印结果将是它的索引值,提供便利
dict1={'a':1,'b':2,'c':3}
for i in dict1:
    print(i) #字典将打印键值而非结果

以上代码我们首先对sr进行遍历,然后自己生成了一个字典对象进行比较:

结果如下:

怎么取出series对象中value最大值_Python_07

嘿嘿,可以看到,for循环Series对象将打印它的值,而对于字典来说将打印它的索引!所以使用Series对象我们就可以在遍历时直接获取结果而过滤索引值,是不是很方便呢?嘿嘿,谈到过滤,Series对象还支持布尔运算呢,这意味我们可以直接指定想要获取值的范围,比如:

sr[sr>0]  #布尔型过滤

打印结果为:

怎么取出series对象中value最大值_数据分析_08

该操作自动将大于0的数筛出,是不是很方便呢?!哈哈

那么既然如此,Series对象支持布尔运算,那我可不可以支持一下四则运算呢?加减乘除行不行!来看:

n1=sr*2
n2=sr+sr
n3=sr+2
print(n1)
print(n2)
print(n3)   #所支持的标量运算

运算结果为:

怎么取出series对象中value最大值_数据分析_09

嘿嘿,可以看到它支持这些运算,尤其注意当一个Series对象加上一个标量时竟然是给它每个元素值都加上这个标量值,这里是真的牛逼了!因为常规语言是不支持不同类型对象进行运算的。。。(除非重载,嘿嘿,我们大概知道它的原理了吧!)

谈完了以上基本操作,让我们来谈点更高级的。

眼尖的小火伴估计发现了,在我们对Series对象指定的标签和下标都是整数时,会发生什么情况呢?换句话说,假如我用下标-1去对sr对象进行索引,我们可以得到sr对象的最后一个元素吗?让我们来看看:

#通过整数索引出现可能会出现的一些问题
sr2=pd.Series(np.arange(10))
print(sr2)
print('\n')
sr3=sr2[5:].copy()
sr3

我们首先生成了一个sr3对象,打印结果如下:

怎么取出series对象中value最大值_Python_10

可接下来我们进行sr3[-1]会得到预期结果9吗?

print(sr3[-1])#常规是索引,即最后一个,但是会报错,why? 原因是当整数作为索引时,他会将其视为标签

结果是啥?

怎么取出series对象中value最大值_Python_11

嘿嘿,果然报错了!原因是-1 is not in range,为什么呢?原来是Series对象在整数做索引时,默认将其视为标签,而sr3得标签分别为5,6,7,8,9,所以-1自然不在序列中!所以就报错了!那怎么获得最后一个元素呢?简单呗,直接sr3[9],嘿嘿,这当然可以!但是,我们假如不知道最后一个元素得标签呢?嘿嘿,眼尖得小伙伴估计看到了,Series默认这种模式,那我们可以改变这种模式!

# loc方法一定解释为标签,这个sr3.loc[-1] 和sr3[-1]没有差异
# iloc一定解释为下标,因此将会输出正确的运算结果
print(sr3.iloc[-1])  #解释为下标,因此会输出sr3的最后一个序列,可见运行成功

iloc方法可以将整数转为下标,因此以上结果输出为:

怎么取出series对象中value最大值_python_12


了解了吗?!所以整数索引时务必注意!

接下来我们再看一下它的数据对齐功能!

#Series的数据对齐
sr4=pd.Series([12,23,34],index=['c','a','d'])
sr5=pd.Series([11,20,10],index=['d','c','a'])
sr4+sr5    #猜猜会发生什么,嘿嘿,请看以下结果,它将两个数据对齐了,会按照索引对齐之后再计算

结果为:

怎么取出series对象中value最大值_Python_13

哦吼,他自动将相同标签下得索引值相加返回了!牛逼!

假如数据不一致会发生什么呢?(Series对象元素不等)

#数据不一致的情况
sr4=pd.Series([12,23,34],index=['c','a','d'])
sr5=pd.Series([11,20,10,16],index=['d','c','a','b'])
sr4+sr5    #嘿嘿,明白了吧,嘿嘿!

结果为:

怎么取出series对象中value最大值_python_14

看到了吧!多余的数他自动给我填充 NaN了,可我明明不是啊?怎么办?

#如何解决以上问题
sr4.add(sr5,fill_value=0)   #嘿嘿

嘿嘿,我们相加的时候将空值填充为0即可,这样:

怎么取出series对象中value最大值_python_15

这里b就有值了啊!哈哈

ok,那么有小火伴可能就会问了,我可以判断对象是否有缺失值而提前采取措施吗?

#缺失值处理,可以不管,也可以进行处理
#删除、
#isnull判断是否缺失notnull
sr6=sr4+sr5
print(sr6.isnull())
print(sr6.notnull())

结果为:

怎么取出series对象中value最大值_数据分析_16

嘿嘿明白了吧?

那判断之后,我们能对缺失值进行如何处理呢?一是直接删除,2是使用其他数据进行填充。

#mean函数其实是求平均值的哟,哈哈
#那么我们如何以平均值来填充呢?
print(sr6.dropna()) #直接删除,可以看到结果的确没有了。嘿嘿
print(sr6.fillna(sr6.mean()))  #嘿嘿结果是不是一目了然呀,嘿嘿

结果为:

怎么取出series对象中value最大值_Python_17

dropna将缺失值进行了删除,而fillna方法使用sr6对象的其余元素的均值对缺失值进行了填充。了解了吗?

嘿嘿,让我们来总结一下今天的知识点:

创建并访问Series对象

Series数据对齐功能

Series四则运算

Series缺失值处理

Series对象的特性

嘿嘿,欧克了吗?其实由于Series对象有列表和字典的特性,所以我们同时也学了很多关于列表和字典的知识,并且,那么,我们是不是对列表和字典的学习就会更容易了呢?haha…