Python数据分析: 初识Pandas,理解Pandas实现和原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析: 初识Pandas,理解Pandas实现和原理相关的知识,希望对你有一定的参考价值。

参考技术A 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

01 重要的前言

这段时间和一些做数据分析的同学闲聊,我发现数据分析技能入门阶段存在一个普遍性的问题,很多凭着兴趣入坑的同学,都能够很快熟悉Python基础语法,然后不约而同的一头扎进《利用Python进行数据分析》这本经典之中,硬着头皮啃完之后,好像自己什么都会了一点,然而实际操作起来既不知从何操起,又漏洞百出。

至于原因嘛,理解不够,实践不够是两条老牌的拦路虎,只能靠自己来克服。还有一个非常有意思且经常被忽视的因素——陷入举三反一的懵逼状态。

什么意思呢?假如我是个旱鸭子,想去学游泳,教练很认真的给我剖析了蛙泳的动作,扶着我的腰让我在水里划拉了5分钟,接着马上给我讲解了蝶泳,又是划拉了5分钟,然后又硬塞给我潜泳的姿势,依然是划拉5分钟。最后,教练一下子把我丢进踩不到底的泳池,给我呐喊助威。

作为一个还没入门的旱鸭子,教练倾囊授了我3种游泳技巧,让我分别实践了5分钟。这样做的结果就是我哪一种游泳技巧也没学会,只学会了喝水。当一个初学者一开始就陷入针对单个问题的多种解决方法,而每一种方法的实践又浅尝辄止,在面对具体问题时往往会手忙脚乱。

拿Pandas来说,它的多种构造方式,多种索引方式以及类似效果的多种实现方法,很容易把初学者打入举三反一的懵逼状态。所以,尽量避开这个坑也是我写Pandas基础系列的初衷,希望通过梳理和精简知识点的方式,给需要的同学一些启发。目前暂定整个基础系列分为4篇,基础篇过后便是有趣的实战篇。

下面开始进入正题(我真是太唠叨了)。

02 Pandas简介

江湖上流传着这么一句话——分析不识潘大师(PANDAS),纵是老手也枉然。

Pandas是基于Numpy的专业数据分析工具,可以灵活高效的处理各种数据集,也是我们后期分析案例的神器。它提供了两种类型的数据结构,分别是DataFrame和Series,我们可以简单粗暴的把DataFrame理解为Excel里面的一张表,而Series就是表中的某一列,后面学习和用到的所有Pandas骚操作,都是基于这些表和列进行的操作(关于Pandas和Excel的形象关系,这里推荐我的好朋友张俊红写的《对比EXCEL,轻松学习Python数据分析》)。

这里有一点需要强调,Pandas和Excel、SQL相比,只是调用和处理数据的方式变了,核心都是对源数据进行一系列的处理,在正式处理之前,更重要的是谋定而后动,明确分析的意义,理清分析思路之后再处理和分析数据,往往事半功倍。

03 创建、读取和存储

1、创建

在Pandas中我们想要构造下面这一张表应该如何操作呢?

别忘了,第一步一定是先导入我们的库——import pandas as pd

构造DataFrame最常用的方式是字典+列表,语句很简单,先是字典外括,然后依次打出每一列标题及其对应的列值(此处一定要用列表),这里列的顺序并不重要:

左边是jupyter notebook中dataframe的样子,如果对应到excel中,他就是右边表格的样子,通过改变columns,index和values的值来控制数据。

PS,如果我们在创建时不指定index,系统会自动生成从0开始的索引。

2、 读取

更多时候,我们是把相关文件数据直接读进PANDAS中进行操作,这里介绍两种非常接近的读取方式,一种是CSV格式的文件,一种是EXCEL格式(.xlsx和xls后缀)的文件。

读取csv文件:

engine是使用的分析引擎,读取csv文件一般指定python避免中文和编码造成的报错。而读取Excel文件,则是一样的味道:

非常easy,其实read_csv和read_excel还有一些参数,比如header、sep、names等,大家可以做额外了解。实践中数据源的格式一般都是比较规整的,更多情况是直接读取。

3、存储

存储起来一样非常简单粗暴且相似:

04 快速认识数据

这里以我们的案例数据为例,迅速熟悉查看N行,数据格式概览以及基础统计数据。

1、查看数据,掐头看尾

很多时候我们想要对数据内容做一个总览,用df.head()函数直接可以查看默认的前5行,与之对应,df.tail()就可以查看数据尾部的5行数据,这两个参数内可以传入一个数值来控制查看的行数,例如df.head(10)表示查看前10行数据。

2、 格式查看

df.info()帮助我们一步摸清各列数据的类型,以及缺失情况:

从上面直接可以知道数据集的行列数,数据集的大小,每一列的数据类型,以及有多少条非空数据。

3、统计信息概览

快速计算数值型数据的关键统计指标,像平均数、中位数、标准差等等。

我们本来有5列数据,为什么返回结果只有两列?那是因为这个操作只针对数值型的列。其中count是统计每一列的有多少个非空数值,mean、std、min、max对应的分别是该列的均值、标准差、最小值和最大值,25%、50%、75%对应的则是分位数。

05 列的基本处理方式

这里,我们采用SQL四大法宝的逻辑来简单梳理针对列的基本处理方式——增、删、选、改。

温馨提示:使用Pandas时,尽量避免用行或者EXCEL操作单元格的思维来处理数据,要逐渐养成一种列向思维,每一列是同宗同源,处理起来是嗖嗖的快。

1、增

增加一列,用df[‘新列名’] = 新列值的形式,在原数据基础上赋值即可:

2、删:

我们用drop函数制定删除对应的列,axis = 1表示针对列的操作,inplace为True,则直接在源数据上进行修改,否则源数据会保持原样。

3、选:

想要选取某一列怎么办?df[‘列名’]即可:

选取多列呢?需要用列表来传递:df[[‘第一列’,‘第二列’,‘第三列’…]]

4、 改:

好事多磨,复杂的针对特定条件和行列的筛选、修改,放在后面结合案例细讲,这里只讲一下最简单的更改:df[‘旧列名’] = 某个值或者某列值,就完成了对原列数值的修改。

06 常用数据类型及操作

1、字符串

字符串类型是最常用的格式之一了,Pandas中字符串的操作和原生字符串操作几乎一毛一样,唯一不同的是需要在操作前加上".str"。

小Z温馨提示:我们最初用df2.info()查看数据类型时,非数值型的列都返回的是object格式,和str类型深层机制上的区别就不展开了,在常规实际应用中,我们可以先理解为object对应的就是str格式,int64对应的就是int格式,float64对应的就是float格式即可。

在案例数据中,我们发现来源明细那一列,可能是系统导出的历史遗留问题,每一个字符串前面都有一个“-”符号,又丑又无用,所以把他给拿掉:

一般来说清洗之后的列是要替换掉原来列的:

2、 数值型

数值型数据,常见的操作是计算,分为与单个值的运算,长度相等列的运算。

以案例数据为例,源数据访客数我们是知道的,现在想把所有渠道的访客都加上10000,怎么操作呢?

只需要选中访客数所在列,然后加上10000即可,pandas自动将10000和每一行数值相加,针对单个值的其他运算(减乘除)也是如此。

列之间的运算语句也非常简洁。源数据是包含了访客数、转化率和客单价,而实际工作中我们对每个渠道贡献的销售额更感兴趣。(销售额 = 访客数 X 转化率 X 客单价)

对应操作语句:df[‘销售额’] = df[‘访客数’] * df[‘转化率’] * df[‘客单价’]

但为什么疯狂报错?

导致报错的原因,是数值型数据和非数值型数据相互计算导致的。PANDAS把带“%”符号的转化率识别成字符串类型,我们需要先拿掉百分号,再将这一列转化为浮点型数据:

要注意的是,这样操作,把9.98%变成了9.98,所以我们还需要让支付转化率除以100,来还原百分数的真实数值:

然后,再用三个指标相乘计算销售额:

3、时间类型

PANDAS中时间序列相关的水非常深,这里只对日常中最基础的时间格式进行讲解,对时间序列感兴趣的同学可以自行查阅相关资料,深入了解。

以案例数据为例,我们这些渠道数据,是在2019年8月2日提取的,后面可能涉及到其他日期的渠道数据,所以需要加一列时间予以区分,在EXCEL中常用的时间格式是’2019-8-3’或者’2019/8/3’,我们用PANDAS来实现一下:

在实际业务中,一些时候PANDAS会把文件中日期格式的字段读取为字符串格式,这里我们先把字符串’2019-8-3’赋值给新增的日期列,然后用to_datetime()函数将字符串类型转换成时间格式:

转换成时间格式(这里是datetime64)之后,我们可以用处理时间的思路高效处理这些数据,比如,我现在想知道提取数据这一天离年末还有多少天(‘2019-12-31’),直接做减法(该函数接受时间格式的字符串序列,也接受单个字符串):

Python全栈开发:初识Python

一、Pythton简介

  python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。

  Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/),是一种面向对象、直译式的计算机程序语言,具有近二十年的发展历史。它包含了一组功能完备的标准库,能够轻松完成很多常见的任务。它的语法简单,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。 与Scheme、Ruby、PerlTcl动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用。它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务。Python虚拟机本身几乎可以在所有的作业系统中运行。使用一些诸如py2exe、PyPy、PyInstaller之类的工具可以将Python源代码转换成可以脱离Python解释器运行的程序。 Python的官方解释器是CPython,该解释器用C语言编写,是一个由社区驱动的自由软件,目前由Python软件基金会管理。 Python支持命令式程序设计、面向对象程序设计、函数式编程、面向侧面的程序设计、泛型编程多种编程范式。

  

  Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。

    目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。

为什么是Python而不是其他语言?

    C 和 Python、Java、C#等

    C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作

    其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行

Python 和 C  Python这门语言是由C开发而来

  对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.
  对于速度:Python的运行速度相较与C,绝逼是慢了

Python 和 Java、C#等

  对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持
  对于速度:Python在速度上可能稍显逊色

所以,Python和其他语言没有什么本质区别,其他区别在于:擅长某领域、人才丰富、先入为主。

Python的种类

  • Cpython
        Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
  • Jyhton
        Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。
  • IronPython
        Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似)
  • PyPy(特殊)
        Python实现的Python,将Python的字节码字节码再编译成机器码。
  • RubyPython、Brython ...

以上除PyPy之外,其他的Python的对应关系和执行流程如下:

 

PyPy,在Python的基础上对Python的字节码进一步处理,从而提升执行速度!

二、python环境

安装Python

window:(多版本共存)
1、下载安装包
    https://www.python.org/downloads/
2、安装python2.7.11
    默认安装路径:C:\\python27
3、配置环境变量
    【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用;分割】
    如:原来的值;C:\\python27,切记前面有分号
4、安装python3.5.1
    默认安装路径: C:\\python36
5、将python3.6中的执行程序python.exe重命名成python3
6、配置环境变量
    【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用;分割】
     如:原来的值;C:\\python36,切记前面有分号
7、这样就实现python2.7和python3.6多版本
 
linux:
1、无需安装,原装Python环境
2、Python27和Python36可以共存

 更新Python

windows:
    卸载重装即可
linux:
    Linux的yum依赖自带Python,为防止错误,此处更新其实就是再安装一个Python
查看默认Python版本
python -V
   
1、安装gcc,用于编译Python源码
    yum install gcc
2、下载源码包,https://www.python.org/ftp/python/
3、解压并进入源码文件
4、编译安装
    ./configure
    make all
    make install
5、查看版本
    /usr/local/bin/python3.6 -V
6、修改默认Python版本
    mv /usr/bin/python /usr/bin/python2.7
    ln -s /usr/local/bin/python3.6 /usr/bin/python
7、防止yum执行异常,修改yum使用的Python版本
    vi /usr/bin/yum
    将头部 #!/usr/bin/python 修改为 #!/usr/bin/python2.7

 三、Python 代码编写

1、第一句Python代码

在 /home/dev/ 目录下创建 hello.py 文件,内容如下:

print("hello world")

执行 hello.py 文件,即: python /home/dev/hello.py

python内部执行过程如下:

2、解释器

上一步中执行 python /home/dev/hello.py 时,明确的指出 hello.py 脚本由 python 解释器来执行。

如果想要类似于执行shell脚本一样执行python脚本,例: ./hello.py ,那么就需要在 hello.py 文件的头部指定解释器,如下:

#!/usr/bin/env python
print ("hello,world")

 如此一来,执行: ./hello.py 即可。

ps:执行前需给予 hello.py 执行权限,chmod 755 hello.py

    在Linux下执行的时候,第一行指出文件由python解释器来执行,第二行是告诉解释器在加载文件时,采用何种编码,不加上这句的话,在python2中显示中文会出现乱码,在python3中则不会,所以你如果用的是windows而且用的是python3,其实可以不用加这两句,不过实际中还是建议加上这两句。到这里我们就用了两种方式输Hello World。

四、内容编码

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)

1、ASCII

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode

2、Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多

3、UTF-8

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

所以,python2.X解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:

报错:ascii码无法表示中文

#!/usr/bin/env python
print "你好,世界"

 改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
print "你好,世界"

  注意:python3.x中字符集默认为UTF-8,python2.x还是ASCII所以需要设置#coding:utf-8

#!/usr/bin/env python
#-*- coding:utf-8 -*-
 
# Python27,解码要指定原编码,编码要指定编成什么码
 
temp = "李杰"
 
temp_unicode = temp.decode("utf-8")
 
temp_gbk = temp_unicode.encoding("gbk")
 
print(temp_gbk)
 
# Python35,gbk和utf-8可以直接转换
 
temp = "李杰" # 为 utf-8 编码
temp_gbk = temp.enoding("utf-8")

五、注释

  当行注视:# 被注释内容

  多行注释:""" 被注释内容 """

      表示续行符: \\

注意:如果\'\'\'\'\'\'三引号是在一个def 函数或者class 定义类的下方则是对这个函数或者类的说明,可以通过__doc__动态获得文档子串

六、执行脚本传入参数

Python有大量的模块,从而使得开发Python程序非常简洁。类库包括3种:

  • Python内部提供的模块
  • 业内开源的模块
  • 程序员自己开发的模块

Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持

sys

Python内部提供一个 sys 的模块,其中的 sys.argv 用来捕获执行执行python脚本时传入的参数

#!/usr/bin/env python
# -*- coding: utf-8 -*-
   
import sys
print (sys.argv)

# 输出
[root@localhost]# python test.py helo world
[\'test.py\', \'helo\', \'world\'#把执行脚本时传递的参数获取到了

os

>>> import os
>>> os.system("df -h")

 注意:os.system()执行系统命令,如果有变量存储该执行的结果,该变量只会存储该命令执行成功或者失败返回值,不会存储命令执行的结果,os.system("df -h")会有返回值。

>>> result = os.system("df -h")
df: ‘/mnt/hgfs’: Protocol error
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           797M  9.4M  788M   2% /run
/dev/sda1       189G   10G  170G   6% /
tmpfs           3.9G   16M  3.9G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
cgmfs           100K     0  100K   0% /run/cgmanager/fs
tmpfs           797M   76K  797M   1% /run/user/1000
 
>>> print(result)
256

 如果需要保存命令执行的结果需哟使用os.popen("系统命令").read(),然后使用变量赋值输出即可

>>> result = os.popen("df -h").read()
 
>>> print(result)
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           797M  9.4M  788M   2% /run
/dev/sda1       189G   10G  170G   6% /
tmpfs           3.9G   16M  3.9G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
cgmfs           100K     0  100K   0% /run/cgmanager/fs
tmpfs           797M   76K  797M   1% /run/user/1000

 sys与os结合使用

#!/usr/bin/env python
import os,sys
 
os.system(\'\'.join(sys.argv[1:]))
 
# 执行
[root@localhost]# python e.py df
df: ‘/mnt/hgfs’: Protocol error
Filesystem     1K-blocks     Used Available Use% Mounted on
udev             4059116        0   4059116   0% /dev
tmpfs             815812     9596    806216   2% /run
/dev/sda1      198036724 10435852 177518160   6% /
tmpfs            4079040    15996   4063044   1% /dev/shm
tmpfs               5120        4      5116   1% /run/lock
tmpfs            4079040        0   4079040   0% /sys/fs/cgroup
cgmfs                100        0       100   0% /run/cgmanager/fs
tmpfs             815812       76    815736   1% /run/user/1000

 七、 pyc 文件

执行Python代码时,如果导入了其他的 .py 文件,那么,执行过程中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译之后产生的字节码。

ps:代码经过编译可以产生字节码;字节码通过反编译也可以得到代码。

八、变量

1、声明变量

#!/usr/bin/env python
# -*- coding: utf-8 -*-
   
name = "wupeiqi"

 上述代码声明了一个变量,变量名为: name,变量name的值为:"wupeiqi"

变量的作用:昵称,其代指内存里某个地址中保存的内容

2、变量定义的规则:

  • 变量名只能是 字母、数字或下划线的任意组合
  • 变量名的第一个字符不能是数字
  • 以下关键字不能声明为变量名
    [\'and\', \'as\', \'assert\', \'break\', \'class\', \'continue\', \'def\', \'del\', \'elif\', \'else\', \'except\', \'exec\', \'finally\', \'for\', \'from\', \'global\', \'if\', \'import\', \'in\', \'is\', \'lambda\', \'not\', \'or\', \'pass\', \'print\', \'raise\', \'return\', \'try\', \'while\', \'with\', \'yield\']
    # 通过Import keyword查看
    
    import keyword
    print(keyword.kwlist)
    

变量的赋值

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
name1 = "wupeiqi"
name2 = "alex"

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
name1 = "wupeiqi"
name2 = name1

 

3、变量最佳命方式:

  1. 使用下划线\'_\'作为连接,如 name_variables
  2. 使用大小写,称为驼峰法,如 NameVariables,nameVariables

  注意:两种命名方式不要混用,只要你喜欢的一种即可

4、变量命名惯例:

  1. 以单一下划线开头的变量名(_x)不会被from module import * 语句导入
  2. 以两个下划线开头但结尾没有下划线的变量名(__x)是类的本地变量
  3. 前后有双下划线的变量名(__x__)是系统定义的变量名,对python解释器有特殊意义
  4. 交互式模式下,变量名"_"用于保存最后表达式的结果
 九、输入

Python输入:

1、Python3.x提供了一个input(),可以让用户输入字符串。比如输入用户的名字:

python3中格式化输出默认接收的都视为字符串,如果你获取的是要数字类型则需要另外强制转换为int()转换为数字类型才能获得数字

 

>>> name = input("please input your name:")
please input your name:tomcatxiao
>>> print("Hello " + name)
Hello tomcatxiao
 
>>> age = input("please enter your age:")
please enter your age:21
>>> type(age)
<class \'str\'>
 
>>> age1 = input("please enter your age:")
>>> age1 = int(age1)
>>> type(age1)
<class \'int\'>

输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法,即:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
import getpass
  
# 将用户输入的内容赋值给 pwd 变量
pwd = getpass.getpass("请输入密码:")
  
# 打印输入的内容
print (pwd)

注意:在pycharm IDE工具中这段代码是行不通的,在Linux命令行或者Windows cmd中是可以的

 

2、Python2.x提供了一个raw_input()和input(),input()在python2中基本不用忘了吧,当然我这里会演示他们的区别

raw_input()在字符串和数值型都没有问题

>>> name = raw_input("please enter your name:")
please enter your name:tomcatxiao
>>> print name
tomcatxiao
 
>>> age = raw_input("your age is:")
your age is:21
>>> print age
21

 input()在输入字符串的时候报错,变量未定义,数值型则没有报错,如果是字符串则需要引号\'\' or "",或者事先定义变量赋值

>>> name = input("please input your name:")
please input your name:tomcatxiao
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name \'tomcatxiao\' is not defined

>>> age = input("your age is:")
your age is:21

 对于上面的代码进行修改下,将字符串事先赋值给一个变量,然后从input中输入则没有报错

>>> myname = "tomcatxiao"
>>> name = input("please input your name:")
please input your name:myname

>>> print name
tomcatxiao

 Python输出:

Python中输出是用print,Python2.x中print是语句,Python3.x中则是print()函数

注意:python3中格式化输出默认接收的都视为字符串,如果是数字则需要另外强制转换为int()转换为数字类型

 

十、If 流程控制和缩进

python的比较操作:

所有的Python对象都支持比较操作:

  • 可用于测试值相等、相对大小等
  • 如果是复合对象,python会检查其所有部分,包括自动遍历各级嵌套对象,知道可以得出最终结果

测试操作符:

  • "==" 操作符测试值的相等性
  • "is" 表达式测试对象的一致性
  • "in" 成员关系测试

如何实现比较操作:

python中不同类型的比较方法:

  • (1)数字:通过相对大小进行比较
  • (2)字符串:按照字典次序逐次进行比较
  • (3)列表和元组:自左至右比较各部分内容
  • (4)字典:对排序之后的(键、值)列表进行比较

python中真和假的含义:

  • (1)非0数字为真,否则为假
  • (2)非空对象为真,否则为假
  • (3)None则始终为假

比较和相等测试会递归地应用于数据结构中
返回值为True或False

组合条件测试:

  • X and Y: 与运算
  • X or Y: 或运算
  • not X : 非运算

if测试的语法结构:

if boolean_expression1:
    suite1
elif boolean_expression2:
    suite2
else:
    else_suite

 注意:
elif语句是可选的
仅用与占位,而后在填充相关语句时,可以使用pass

if/else三元表达式:

通常在为某变量设定默认值时通常用到如下表达式

A = X if Y else Z

或 

if Y:
    A = X
else
    A = Z

 其通用条件表达式语法格式为:

expression1 if boolean_express else expression2

 如果boolean_express的值为True,则条件表达式的结果为express1,否则为express2

十一、循环for,while

循环机制及应用场景
while循环:

  • (1)用于编写通用迭代结构
  • (2)顶端测试为真即会执行循环体,并会重复多次测试知道为假后执行循环后的其他语句


for循环:

  • (1)一个通用的序列迭代器,用于遍历任何有序的序列对象内的元素
  • (2)可用于字符串、元组、列表和其他的内置可迭代对象,以及通过类所创建的新对象


python也提供了一些能够进行隐性迭代的工具:

  • (1)in成员关系测试
  • (2)列表解析
  • (3)map、reduce和filter函数

 

break: 跳出最内层的循环
continue: 跳出所处的最近层循环的开始处
pass: 占位语句

 

外层变量,可以被内层代码使用
内层变量,不应被外层代码使用

 

while循环:

1、基本循环

while True: 死循环

语法格式:

while boolean_express:
    while_suite
else:
    else_suite

 注意:

  1. else分支为可选部分
  2. 只要boolean_express的结果为True,循环就会执行
  3. boolean_express的结果为False时终止循环,此时如果有else分支,则会执行

示例:

url = \'www.baidu.com\'
while url:
    print(url)
    url = url[:-1]
#====================== x = 0; y = 100 while x < y: print(x) x += 1 #======================
url = \'www.baidu.com\'
while url:
print(url)
url = url[:-1]
else:
print(\'game over\')

 2、break

break用于退出所有循环

while True:
    print ("123")
    break
    print ("456")

 3、continue

continue用于退出本次循环,继续下一次循环

while True:
    print ("123")
    continue
    print ("456“)

while大量练习:

# 练习1:逐一显示指定列表中的所有元素
# 方法1:
l1 = list(range(1,6))
while l1:
    print(l1[0])
    l1.pop(0)

# 方法2:
l1 = list(range(1,6))
while l1:
    print(l1[-1])
    l1.pop()

## 方法3:
l1 = list(range(1,6))
print(l1)
i = 0
while i < len(l1):
    print(\'index:\', i, \'num:\', l1[i])
    i += 1


# 练习2:求100以内所有偶数之和
sum = 0
n = 1
while n <= 100:
    if n % 2 == 0:
        sum = sum + n
    n = n + 1

print(\'100以内所有偶数之和:\',sum)

# 练习3:逐一显示指定字典的所有键;并于显示结束后说明总键数;
d1 = {\'x\':11, \'y\':22, \'z\':33}
k1 = d1.keys()
while k1:
    print(k1[0])
    k1.pop[0]
else:
    print(len(d1))

# 练习4:创建一个包含了100以内所有奇数的列表
l1 = []
x = 1
while x < 100:
    l1.append(x)
    x += 2
else:
    print(l1)

# 练习5:逆序逐一显示一个列表的所有元素
l1 = list(range(1,6))
while l1:
    print(l1[-1])
    l1.pop(-1)

# 练习6:
# 列表l1 = [0,1,2,3,4,5,6]
# 列表l2 = [\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\']
# 以第一个列表中的元素为键,以第二个列表中的元素为值生成字典d1

l1 = [0,1,2,3,4,5,6]
l2 = [\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\']
d1 = {}
i = 0
while i < len(l1):
    if len(l1) == len(l2):
        d1[l1[i]] = l2[i]
        i += 1
else:
    print(d1)

 for循环:

语法格式:

for expression1 in iterable:
    for_suite
else:
    else_suite

通常,expression或是一个单独的变量,或是一个变量序列,一般以元组的形式给出
如果以元组或列表用于expression,则其中的每个数据项都会拆分到表达式的项

T = [(1,2),(3,4),(5,6),(7,8)]
for (a,b) in T:
    print(a,b)

结果:
1 2
3 4
5 6
7 8

 编写循环的技巧:
(1)for循环比while循环执行速度快
(2)python提供了两个内置函数,用于在for循环中定制特殊的循环python3.x 只有range,python2.x有(range,xrange)

  • range: 一次性地返回连续的整数列表
  • xrange: 一次产生一个数据元素,相较于range更节约空间
  • zip:返回并行的元素元组的列表,常用于在for循环中遍历数个序列

range()函数:非完备遍历
用于每隔一定的个数元素挑选一个元素

>>> s = "How are you these day?"
>>> range(0, len(s), 2)
range(0, 22, 2)
>>> for i in range(0, len(s), 2):
        print(s[i])
结果: H w a e y u t e e d y

 修改列表

>>> L = [1,2,3,4,5]
>>> for i in range(len(L)):
...     L[i] += 1
...     
>>> L
[2, 3, 4, 5, 6]

zip()函数:并行遍历
取得一个或多个序列为参数,将给定序列中的并排的元素配成元组,返回这些元组的列表
当参数长度不同时,zip会以最短序列的长度为准

1.可在for循环中用于实现并行迭代

>>> L1 = [1,2,3,4,5,6,7]
>>> L2 = [\'a\',\'b\',\'c\',\'d\',\'e\',\'e\',\'f\',\'g\']
>>> zip(L1,L2))
<zip object at 0x0000021FA418B088>
>>> for i in (zip(L1,L2)):
...     print(i)
...     
(1, \'a\')
(2, \'b\')
(3, \'c\')
(4, \'d\')
(5, \'e\')
(6, \'e\')
(7, \'f\')

 2. zip也常用于动态构造字典

>>> keys = [1,2,3,4,5,6,7]
>>> values = [\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\'] >>> for k,v in zip(keys,values): ... D[k] = v ... >>> D {1: \'Sun\', 2: \'Mon\', 3: \'Tue\', 4: \'Wed\', 5: \'Thu\', 6: \'Fri\', 7: \'Sat\'}

  for大量练习:

for循环练习:
练习1:逐一分开显示指定字典d1中的所有元素,类似如下;
    k1  v1
    k2  v2

d1 = {\'x\':123,\'y\':321,\'z\':734}
for k, v in d1.items():
    print(k ,v)

结果: 
x 123
y 321
z 734

练习2:逐一显示列表中L1=[\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\']中索引为奇数的元素;

L1=[\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\']
L2 =[\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\']
for i in range(1, len(L1), 2):
    print(L1[i])

结果:     
Mon
Wed
Fri

练习3:将属于列表L1=[\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\'],但不属于列表L2=[\'Sun\',\'Mon\',\'Tue\',\'Thu\',\'Sat\']的所有元素定义为一个新列表l3;

L1=[\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\']
L2=[\'Sun\',\'Mon\',\'Tue\',\'Thu\',\'Sat\']
L3=[]
for i in L1:
    if i not in L2:
        L3.append(i)
else:
    print(L3)

结果:
[\'Wed\', \'Fri\']

练习4:
将属于列表namelist=[\'stu1\',\'stu2\',\'stu3\',\'stu4\',\'stu5\',\'stu6\',\'stu7\'],
删除列表removelist=[\'stu3\',\'stu7\',\'stu9\'];请将属于removelist列表中的每个元素从namelist中移除(属于removelist,但不属于namelist的忽略即可)

namelist=[\'stu1\',\'stu2\',\'stu3\',\'stu4\',\'stu5\',\'stu6\',\'stu7\']
removelist=[\'stu3\',\'stu7\',\'stu9\']
for i in removelist:
    if i in namelist:
        namelist.remove(i)
print(namelist)

结果:
[\'stu1\', \'stu2\', \'stu4\', \'stu5\', \'stu6\']

 场景一、用户登陆验证

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import getpass

name = \'tom\'
pwd = 123456
count = 0

while True:
    if count < 3:
        print("please enter your name and password !")
        username = input("username: ")
        password = getpass.getpass("password: ")

        if username == name and password == pwd:
            print("恭喜你登录成功")
            break
        else:
            print("登录失败!用户名或者密码错误")
            count += 1
    else:
        print("你已经错误3次,正在退出")
        break

场景二、根据用户输入内容输出其权限

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 根据用户输入内容打印其权限
# alex --> 超级管理员
# eric --> 普通管理员
# tony,rain --> 业务主管
# 其他 --> 普通用户

tag = True
while tag:
    name = input(\'请输入用户名:\')
    if name == \'q\' or name == \'Q\':
        tag = False
    else:
        if name == \'alex\':
            print("超级管理员")
        elif name == \'eric\':
            print("普通管理员")
        elif name == \'tony\' or name == \'rain\':
            print("业务主管")
        else:
            print("普通用户")

场景三、猜年龄游戏

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

age = 22
count = 0

for i in range(10):
    if count < 3:
        num = int(input("please input age: "))
        if num == age:
            print("恭喜你,答对了")
            break
        elif num > age:
            print("你猜的数字太大了")
        else:
            print("你猜的数字太小了")
    else:
        ss = input("你太笨了,这都猜不对,还继续玩吗?[yes | not]: ")
        if ss == \'yes\' or ss == \'YES\':
            count = 0
            continue
        else:
            print("Bye, 下次再玩")
            break

    count += 1

 

以上是关于Python数据分析: 初识Pandas,理解Pandas实现和原理的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析pandas之series初识

Python数据分析库pandas ------ 初识 matpoltlib:matplotliab画图怎么显示中文;设置坐标标签;主题;画子图;pandas时间数据格式转化;图例;

Python高手之路初识python

python包介绍:GeoPandas(初识)

第三节:初识pandas之DataFrame(上)

Python初识