Python数据分析第一课:Pandas初入门

数据分析如下所示共6步,而使用Python可以帮助我们完成前5步。
在这里插入图片描述

一. Pandas简介

Pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

了解了Pandas的基本概念,再看一下Pandas在数据分析方面有哪些作用呢?
在这里插入图片描述
Pandas提供的数据结构和函数的设计,将使表格化数据的工作快速、简单、有表现力。所以利用Pandas进行数据操作、预处理、清洗是Python数据分析中的重要技能。

二. Pandas数据结构

常见的数据存储形式有Excel和数据库这两种,他们的存储有什么共同点呢?
在这里插入图片描述
Pandas的DataFrame的结构就和他们相同,Series的结构和表中的行的结构相同。

import pandas as pd

# 通过Series存储每个英雄的基本信息
# 创建Series
s1 = pd.Series([1001,'lily','18','150.00','female'])
s2 = pd.Series([1002,'lucy','20','170.00','female'])
s3 = pd.Series([1003,'tomy','22','176.00','male'])
s4 = pd.Series([1004,'lilei','23','178.00','male'])

series_list = [s1,s2,s3,s4]
# 创建一个DataFrame对象存储通讯录
df = pd.DataFrame(series_list)
# 打印df
print(df)

# 输出结果如下:
      0      1   2       3       4
0  1001   lily  18  150.00  female
1  1002   lucy  20  170.00  female
2  1003   tomy  22  176.00    male
3  1004  lilei  23  178.00    male

我们根据df的打印结果进一步解析DataFrame的结构。
在这里插入图片描述
整个数据被分为三部分:行索引(index),列索引(columns)及数据内容(data)。

行、列索引的值在没有自定义的时候,会被默认设置上0-N的值,索引的作用就是为了更好的认知和查询数据。

可以看出每一列数据都是同种类型的数据,如果每一列设定一个有意义的名字,操作的时候就会更加方便。

三. Series的创建

Series是Pandas中最基本的对象,Series类似一种一维数组。事实上,Series 基本上就是基于 NumPy 的数组对象来的。和 NumPy 的数组不同,Series 能为数据自定义标签,也就是索引(index),然后通过索引来访问数组中的数据。

# 导入Series
from pandas import Series,DataFrame

# 创建Series,使用默认索引
se1 = Series(data=[1,'羞羞的尹志平','20','天生爱做色狼,杨过不喜欢他'])
print(se1)

# 输出结果:
0                1
1           羞羞的尹志平
2               20
3    天生爱做色狼,杨过不喜欢他
dtype: object

一个Series其实就是一条数据,Series方法的第一个参数是data,第二个参数是index(索引),如果没有传值会使用默认值(0-N)。

自定义一个索引看看。

# 导入Series
from pandas import Series,DataFrame

# 创建Series,使用自定义索引
se1 = Series(data=[1,'羞羞的尹志平','20','天生爱做色狼,杨过不喜欢他'],index=['序号','姓名','年龄','属性'])
print(se1)

# 输出结果:
序号                1
姓名           羞羞的尹志平
年龄               20
属性    天生爱做色狼,杨过不喜欢他
dtype: object

index参数是我们自定义的索引值,注意:参数值的个数一定要相同。

在创建Series时数据并不一定要是列表,也可以将一个字典传进去。

# 导入Series
from pandas import Series,DataFrame

# 将字典转换为Series
dic = {'name':'小龙女','属性':'超级漂亮','年龄':'29','备注':'杨过的老婆'}
se2 = Series(data=dic)
print(se2)

# 输出结果:
name      小龙女
属性       超级漂亮
年龄         29
备注      杨过的老婆
dtype: object

当数据是字典的时候,会将字典的键作为索引,字典的值作为索引对应的数据值。

综上可以看出,Series是一组带索引数组,与list相似,一般我们用其承装一条数据或者一行数据。多个Series可组成一个DataFrame。

四. DataFrame的创建

DataFrame(数据表)是一种 2 维数据结构,数据以表格的形式存储,分成若干行和列。通过 DataFrame,能很方便地处理数据。
调用DataFrame()可以将多种格式的数据转换为DataFrame对象,它的的三个参数data、index和columns分别为数据、行索引和列索引。

# 导入Series
from pandas import Series,DataFrame

# 创建二维列表,存储人物信息
list = [['杨过','神雕大侠','善于使用独臂大刀'],
        ['小龙女','神雕大侠的妻子','善于使用神雕大侠的大刀'],
        ['尹志平','神雕大侠的妻子的仇人','善于使用神雕大侠的妻子']]

# 创建dataframe
df = DataFrame(data=list)
print(df)

# 输出结果:
     0           1            2
0   杨过        神雕大侠     善于使用独臂大刀
1  小龙女     神雕大侠的妻子  善于使用神雕大侠的大刀
2  尹志平  神雕大侠的妻子的仇人  善于使用神雕大侠的妻子

list是使用一个二维列表,将每一个人物的信息存储到一个列表中。

调用DataFrame()将二维列表转换为DataFrame对象,行列索引使用的是默认0-N数字代表。

# 导入Series
from pandas import Series,DataFrame

# 创建二维列表,存储人物信息
list = [['杨过','神雕大侠','善于使用独臂大刀'],
        ['小龙女','神雕大侠的妻子','善于使用神雕大侠的大刀'],
        ['尹志平','神雕大侠的妻子的仇人','善于使用神雕大侠的妻子']]

# 创建dataframe
df = DataFrame(data=list,index=[1,2,3],columns=['姓名','称号','特长'])
print(df)

# 输出结果:
    姓名          称号           特长
1   杨过        神雕大侠     善于使用独臂大刀
2  小龙女     神雕大侠的妻子  善于使用神雕大侠的大刀
3  尹志平  神雕大侠的妻子的仇人  善于使用神雕大侠的妻子

当然我们也可以使用字典来创建一个DataFrame数据。

# 导入Series
from pandas import Series,DataFrame

# 创建字典,存储人物信息
# list = [['杨过','神雕大侠','善于使用独臂大刀'],
#         ['小龙女','神雕大侠的妻子','善于使用神雕大侠的大刀'],
#         ['尹志平','神雕大侠的妻子的仇人','善于使用神雕大侠的妻子']]

dic = {'姓名':['杨过','小龙女','尹志平'],
       '称号':['神雕大侠','神雕大侠的妻子','神雕大侠的妻子的仇人'],
       '特长':['善于使用独臂大刀','善于使用神雕大侠的大刀','善于使用神雕大侠的妻子']}
# 创建dataframe
df = DataFrame(dic)
print(df)
 
 # 输出结果:
     姓名          称号           特长
0   杨过        神雕大侠     善于使用独臂大刀
1  小龙女     神雕大侠的妻子  善于使用神雕大侠的大刀
2  尹志平  神雕大侠的妻子的仇人  善于使用神雕大侠的妻子

通过结果可以看出当字典格式的数据被dataframe整理后,字典的键将作为数据的列索引值。

五. Series常用属性与方法

表格数据中的每一列或者每一行的数据结构都是Series,它可以看成是一维的表格数据。

它可以属于DataFrame的一部分也可以作为一个独立的数据结构存在。

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 获取数据的值
print(se.values)
print('-'*20)
# 获取索引的值
print(se.index.tolist())
print('-'*20)
# 获取每队数据与索引的值
print(list(se.items()))

# 输出结果:
['亚瑟' '后裔' '小乔' '哪吒' '虞姬' '王昭君']
--------------------
['001', '002', '003', '004', '005', '006']
--------------------
[('001', '亚瑟'), ('002', '后裔'), ('003', '小乔'), ('004', '哪吒'), ('005', '虞姬'), ('006', '王昭君')]

values、index、items返回的对象分别是List、Index、Zip类型的数据,为了方便我们使用和观察数据,可以使用series.index.tolist()和list(series.items())方法转化成列表类型。

Series就像将索引值暴露在外面的List,其实它们除了外表相似以外,在获取数据方面也非常的相似。我们可以通过索引值来进行单个数据的访问,同样也支持切片选择多个数据。

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 使用索引获取单个数值
print(se['002'])
print('-'*20)
# 使用索引获取多个不连续的数值
print('索引下标')
print(se[['001','003','006']])
print('-'*20)
# 使用索引获取多个连续的数值
print('索引切片')
print(se['004':'006'])

# 输出结果:
后裔
--------------------
索引下标
001     亚瑟
003     小乔
006    王昭君
dtype: object
--------------------
索引切片
004     哪吒
005     虞姬
006    王昭君
dtype: object

注意

  • 获取数据格式—对象名[]
  • 获取多个不连续数据时是双层括号— 对象名[[]]
  • 使用切片时使用的是—对象名[:]

那么, 原来的默认索引去哪里了呢?其实还是存在的,并且可以使用。

我们自定的index值被叫做索引下标,没有设置index值时会有一个默认的值叫做位置下标。

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 使用索引获取单个数值
print(se[0])
print('-'*20)
# 使用索引获取多个不连续的数值
print('位置下标')
print(se[[1,3,5]])
print('-'*20)
# 使用索引获取多个连续的数值
print('位置切片')
print(se[3:5])

# 输出结果:
亚瑟
--------------------
位置下标
002     后裔
004     哪吒
006    王昭君
dtype: object
--------------------
位置切片
004    哪吒
005    虞姬
dtype: object

需要注意的是:当使用默认索引进行切片时,不会取最后一个值;而使用自定义索引,则会取到最后一个值。

和Python其它数据结构类似,我们可以很方便的利用循环来遍历Series。

  • 我们可以直接遍历Series的值。
# 遍历并拿到data数据
for value in series:
	print(value)
  • 通过keys(),遍历Series的索引。
# 遍历并拿到index数据
for value in series.keys():
	print(value)
  • 也可以通过items(),遍历Series的每对索引和数据
# 遍历并拿到每对索引和数据
for value in series.items()
	print(value)
# 或者
for key,value in series.items():
	print(key,value)

看如下的示例:

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 获取数据
for data in se:
    print(data)
print('-'*20)
# 获取索引
for value in se.keys():
    print(value)
print('-'*20)
# 同时获取数据与索引
for i in se.items():
    print(i)
print('~'*20)
for j,k in se.items():
    print(j,k)

# 输出结果:
亚瑟
后裔
小乔
哪吒
虞姬
王昭君
--------------------
001
002
003
004
005
006
--------------------
('001', '亚瑟')
('002', '后裔')
('003', '小乔')
('004', '哪吒')
('005', '虞姬')
('006', '王昭君')
~~~~~~~~~~~~~~~~~~~~
001 亚瑟
002 后裔
003 小乔
004 哪吒
005 虞姬
006 王昭君

六. DataFrame数据的获取与遍历

DataFrame里的数据是按照行和列来进行排列,现在我们一起来看下如何对DataFrame的数据按照行或者列进行选择、遍历以及修改。

首先数据的维度是一维还是二维的我们可以使用ndim查看,数据的行数和列数shape,以及行列的索引值index、columns。

import pandas as pd

# 创建字典存储数据
dic = {'姓名': ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子'],
       '年龄': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '绝招': ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌', '眼神就是我的武器'],
       '口号': ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 创建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 打印DataFrame
print(df)
print('-' * 20)
# 获取数据的维度
print(df.ndim)
print('-' * 20)
# 获取行数和列数
print(df.shape)
print('-' * 20)
# 获取行索引
print(df.index.tolist())
print('-' * 20)
# 获取列索引
print(df.columns.tolist())

# 输出结果:
       姓名  年龄   角色        绝招                 口号
001  星宿老怪  80   配角      化功大法          星宿老仙,法力无边
002   李莫愁  36   配角      钢铁浮尘      哼,杨过和小龙女不能在一起
003    乔峰  27   主角     降龙十八掌         小子,看我降龙十八掌
004    段誉  25   主角      六脉神剑         姐姐,我有六脉神剑哦
005    虚竹  26   主角      泡妞大法      梦姑,你在哪里啊?我好想你
006    阿紫  22   配角      毒力无敌  姐夫,我要和你在一起,我要和你困觉
007   逍遥子  98  老配角  眼神就是我的武器       哈哈,你的围棋功力太弱了
--------------------
2
--------------------
(7, 5)
--------------------
['001', '002', '003', '004', '005', '006', '007']
--------------------
['姓名', '年龄', '角色', '绝招', '口号']

需要注意的是,如果我们数据量是10G,像这种数据量比较大并且我们想看数据的具体情况的时候,这些属性就不够用了,如果直接打印df有比较耗时,所以我们可以只获取前几行或者后几行,了解数据的构成即可。

可以使用head()和tail()方法取出前几行或后几行的数据,两个方法都有默认值,默认值是5,如果数据不够5个会将全部数据拿出来。当然也可以自己设置。

import pandas as pd

# 创建字典存储数据
dic = {'姓名': ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子'],
       '年龄': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '绝招': ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌', '眼神就是我的武器'],
       '口号': ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋公里太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 创建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 获取前3条数据
print(df.head(3))
print('-'*20)
# 获取最后3条数据
print(df.tail(3))

# 输出结果:
       姓名  年龄  角色     绝招             口号
001  星宿老怪  80  配角   化功大法      星宿老仙,法力无边
002   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起
003    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌
--------------------
      姓名  年龄   角色        绝招                 口号
005   虚竹  26   主角      泡妞大法      梦姑,你在哪里啊?我好想你
006   阿紫  22   配角      毒力无敌  姐夫,我要和你在一起,我要和你困觉
007  逍遥子  98  老配角  眼神就是我的武器       哈哈,你的围棋功力太弱了

获取行数据

了解数据了,我们就可以修炼下一个招式–获取行数据了。

1. 通过位置索引直接获取
# 通过位置索引切片获取一行
print(df[0:1])
# 通过位置索引切片获取多行
print(df[1:3])
# 获取多行里面的某几列
print(df[1:3][['name','age']])
# 获取DataFrame的列
print(df['name'])
# 如果获取多个列
print(df[['name','age']])

看如下示例:

import pandas as pd

# 创建字典存储数据
dic = {'姓名': ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子'],
       '年龄': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '绝招': ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌', '眼神就是我的武器'],
       '口号': ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 创建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 通过位置索引获取一行数据
print(df[0:1])
print('-'*20)
# 通过位置索引获取多行数据
print(df[0:5])
print('-'*20)
# 获取某几行的某几列数据
print(df[1:3][['姓名','绝招']])
print('-'*20)
# 获取某列数据
print(df['姓名'])
print('~'*20)
print(df[['姓名']])
print('-'*20)
# 获取多列数据
print(df[['姓名','口号']])

# 输出结果:
       姓名  年龄  角色    绝招         口号
001  星宿老怪  80  配角  化功大法  星宿老仙,法力无边
--------------------
       姓名  年龄  角色     绝招             口号
001  星宿老怪  80  配角   化功大法      星宿老仙,法力无边
002   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起
003    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌
004    段誉  25  主角   六脉神剑     姐姐,我有六脉神剑哦
005    虚竹  26  主角   泡妞大法  梦姑,你在哪里啊?我好想你
--------------------
      姓名     绝招
002  李莫愁   钢铁浮尘
003   乔峰  降龙十八掌
--------------------
001    星宿老怪
002     李莫愁
003      乔峰
004      段誉
005      虚竹
006      阿紫
007     逍遥子
Name: 姓名, dtype: object
~~~~~~~~~~~~~~~~~~~~
       姓名
001  星宿老怪
002   李莫愁
003    乔峰
004    段誉
005    虚竹
006    阿紫
007   逍遥子
--------------------
       姓名                 口号
001  星宿老怪          星宿老仙,法力无边
002   李莫愁      哼,杨过和小龙女不能在一起
003    乔峰         小子,看我降龙十八掌
004    段誉         姐姐,我有六脉神剑哦
005    虚竹      梦姑,你在哪里啊?我好想你
006    阿紫  姐夫,我要和你在一起,我要和你困觉
007   逍遥子       哈哈,你的围棋功力太弱了
  • df[]不支持直接输入标签索引获取行数据,例如:df[‘001’],只能通过df[0:1]这种方式
  • 这种方式可以获取一列数据,列如:df[‘name’]或者df[[‘name’]]
  • 如果想获取多行里面的某几列可写成:df[行][列],例如:df[1:3][[‘name’,‘age’]],将行索引值放到同一个列表中,再将列表放到第二个方括号中
  • 这种方式只能获取连续多行的数据,不能间隔获取行数据
2. 通过行位置索引筛选iloc[]
# 取一行
print(df.iloc[1])
# 取连续多行
print(df.iloc[0:2])
# 取间断的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 某一个值
print(df.iloc[1,0])

看如下示例:

import pandas as pd

# 创建字典存储数据
dic = {'姓名': ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子'],
       '年龄': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '绝招': ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌', '眼神就是我的武器'],
       '口号': ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 创建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 获取一行数据
print(df.iloc[[1]])
print('-'*20)
# 获取连续多行的数据
print(df.iloc[0:3])
print('-'*20)
# 获取间断的多行数据
print(df.iloc[[1,3,4]])
print('-'*20)
# 获取某一列的数据
print(df.iloc[:,[2]])
print('-'*20)
# 获取连续多列的数据
print(df.iloc[:,1:3])
print("-"*20)
# 获取间隔多列的数据
print(df.iloc[:,[1,3,4]])
print("-"*20)
# 获取间隔的多行多列的数据
print(df.iloc[[0,2,3],[1,3,4]])
print('-'*20)
# 获取某个数值
print(df.iloc[[1],[0]])
# 输出结果:
      姓名  年龄  角色    绝招             口号
002  李莫愁  36  配角  钢铁浮尘  哼,杨过和小龙女不能在一起
--------------------
       姓名  年龄  角色     绝招             口号
001  星宿老怪  80  配角   化功大法      星宿老仙,法力无边
002   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起
003    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌
--------------------
      姓名  年龄  角色    绝招             口号
002  李莫愁  36  配角  钢铁浮尘  哼,杨过和小龙女不能在一起
004   段誉  25  主角  六脉神剑     姐姐,我有六脉神剑哦
005   虚竹  26  主角  泡妞大法  梦姑,你在哪里啊?我好想你
--------------------
      角色
001   配角
002   配角
003   主角
004   主角
005   主角
006   配角
007  老配角
--------------------
     年龄   角色
001  80   配角
002  36   配角
003  27   主角
004  25   主角
005  26   主角
006  22   配角
007  98  老配角
--------------------
     年龄        绝招                 口号
001  80      化功大法          星宿老仙,法力无边
002  36      钢铁浮尘      哼,杨过和小龙女不能在一起
003  27     降龙十八掌         小子,看我降龙十八掌
004  25      六脉神剑         姐姐,我有六脉神剑哦
005  26      泡妞大法      梦姑,你在哪里啊?我好想你
006  22      毒力无敌  姐夫,我要和你在一起,我要和你困觉
007  98  眼神就是我的武器       哈哈,你的围棋功力太弱了
--------------------
     年龄     绝招          口号
001  80   化功大法   星宿老仙,法力无边
003  27  降龙十八掌  小子,看我降龙十八掌
004  25   六脉神剑  姐姐,我有六脉神剑哦
--------------------
      姓名
002  李莫愁
3. 通过行标签索引筛选loc[]
import pandas as pd

# 创建字典存储数据
dic = {'姓名': ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子'],
       '年龄': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '绝招': ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌', '眼神就是我的武器'],
       '口号': ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 创建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 获取某一行的数据
print(df.loc[['001']])
print('-'*20)
# 获取某一行某一列的数据
print(df.loc[['001'],['姓名']])
print('-'*20)
# 获取某一行多列的数据
print(df.loc[['001'],['姓名','绝招']])
print('-'*20)
# 获取间隔的多行多列的数据
print(df.loc[['001','003'],['姓名','绝招','口号']])
print('-'*20)
# 获取连续多行多列的数据
print(df.loc['001':'003','姓名':'口号'])

# 输出结果:
       姓名  年龄  角色    绝招         口号
001  星宿老怪  80  配角  化功大法  星宿老仙,法力无边
--------------------
       姓名
001  星宿老怪
--------------------
       姓名    绝招
001  星宿老怪  化功大法
--------------------
       姓名     绝招          口号
001  星宿老怪   化功大法   星宿老仙,法力无边
003    乔峰  降龙十八掌  小子,看我降龙十八掌
--------------------
       姓名  年龄  角色     绝招             口号
001  星宿老怪  80  配角   化功大法      星宿老仙,法力无边
002   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起
003    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌
import pandas as pd

# 创建字典存储数据
dic = {'姓名': ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子'],
       '年龄': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '绝招': ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌', '眼神就是我的武器'],
       '口号': ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 创建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 获取某一行所有列的数据
print(df.loc['001',:])
print('-'*20)
# # 获取某一行某一列的数据
print(df.loc['001','姓名'])
print('-'*20)
# # 获取某一行多列的数据
print(df.loc['001',['姓名','绝招']])

# 输出结果:
姓名         星宿老怪
年龄           80
角色           配角
绝招         化功大法
口号    星宿老仙,法力无边
Name: 001, dtype: object
--------------------
星宿老怪
--------------------
姓名    星宿老怪
绝招    化功大法
Name: 001, dtype: object

注意

  • df.loc[] 通过标签索引获取行数据,它的语法结构是这样的:df.loc[[行],[列]],方括号中用逗号分隔,左侧是行、右侧是列
  • 如果行或者列使用切片的时候,要把方括号去掉,列df.loc[‘001’:‘003’,‘姓名’:‘绝招’]。

需要注意的是:loc和iloc的切片操作在是否包含切片终点的数据有差异。

  • loc[‘001’:‘003’]的结果中包含行索引003对应的行。
  • iloc[0:2] 结果中不包含序号为2的数据,切片终点对应的数据不在筛选结果中。

遍历DataFrame

  • iterrows(): 按行遍历。将DataFrame的每一行转化为(index, Series)对。index为行索引值,Series为该行对应的数据
for index,row_data in df.iterrows():
    print(index,row_data)
  • iteritems():按列遍历,将DataFrame的每一列转化为(column, Series)对。column为列索引的值,Series为该列对应的数据。
for col,col_data in df.iteritems():
    print(col)

示例如下:

import pandas as pd

# 创建字典存储数据
dic = {'姓名': ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子'],
       '年龄': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '绝招': ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌', '眼神就是我的武器'],
       '口号': ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 创建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 按行遍历
for index,row_data in df.iterrows():
    print(index,row_data)
print('-'*20)
# 按列遍历
for co,col_data in df.iteritems():
    print(co,col_data)

# 输出结果:
001 姓名         星宿老怪
年龄           80
角色           配角
绝招         化功大法
口号    星宿老仙,法力无边
Name: 001, dtype: object
002 姓名              李莫愁
年龄               36
角色               配角
绝招             钢铁浮尘
口号    哼,杨过和小龙女不能在一起
Name: 002, dtype: object
003 姓名            乔峰
年龄            27
角色            主角
绝招         降龙十八掌
口号    小子,看我降龙十八掌
Name: 003, dtype: object
004 姓名            段誉
年龄            25
角色            主角
绝招          六脉神剑
口号    姐姐,我有六脉神剑哦
Name: 004, dtype: object
005 姓名               虚竹
年龄               26
角色               主角
绝招             泡妞大法
口号    梦姑,你在哪里啊?我好想你
Name: 005, dtype: object
006 姓名                   阿紫
年龄                   22
角色                   配角
绝招                 毒力无敌
口号    姐夫,我要和你在一起,我要和你困觉
Name: 006, dtype: object
007 姓名             逍遥子
年龄              98
角色             老配角
绝招        眼神就是我的武器
口号    哈哈,你的围棋功力太弱了
Name: 007, dtype: object
--------------------
姓名 001    星宿老怪
002     李莫愁
003      乔峰
004      段誉
005      虚竹
006      阿紫
007     逍遥子
Name: 姓名, dtype: object
年龄 001    80
002    36
003    27
004    25
005    26
006    22
007    98
Name: 年龄, dtype: object
角色 001     配角
002     配角
003     主角
004     主角
005     主角
006     配角
007    老配角
Name: 角色, dtype: object
绝招 001        化功大法
002        钢铁浮尘
003       降龙十八掌
004        六脉神剑
005        泡妞大法
006        毒力无敌
007    眼神就是我的武器
Name: 绝招, dtype: object
口号 001            星宿老仙,法力无边
002        哼,杨过和小龙女不能在一起
003           小子,看我降龙十八掌
004           姐姐,我有六脉神剑哦
005        梦姑,你在哪里啊?我好想你
006    姐夫,我要和你在一起,我要和你困觉
007         哈哈,你的围棋功力太弱了
Name: 口号, dtype: object

六. 总结

Series常用属性和方法:

  • 获取数据的值values
  • 获取数据的索引index
  • 获取每对索引和值items()
  • 索引下标:自定义的Index
  • 位置下标:默认的Index
  • 切片:连续se['001:'004];不连续se[[‘001’,‘004’]]
  • 数据遍历:使用for…in values、keys()、items()获取数据、索引和每对索引、数据

DataFrame的数据获取与遍历:

  • 获取数据的行数和列数shape
  • 获取数据的前几行head()和后几行tail()
  • df[]不能直接输入标签索引获取数据
  • 获取多行里面的某几列:df[[行][列]]
  • df.loc[]标签索引获取行数据
  • df.iloc[]位置索引获取行数据
  • 数据遍历:for…in iterrows()按行遍历;for…in iteritems按列遍历

五. 练习

  1. 复仇者联盟
from pandas import Series,DataFrame

# 第一种方法,字典存储天团信息
dic = {'姓名':['小罗伯特·唐尼','克里斯·埃文斯','斯嘉丽·约翰逊','克里斯·海姆斯沃斯'],
       '角色':['钢铁侠','美国队长','黑寡妇','雷神'],
       '武器':['钢铁战衣','盾牌','寡妇蛰','雷神之锤'],
       '语录':['和平,我热爱和平','最好的武器是重新开始','嘿,大兄弟,太阳下山了','要用知识打败无知']}

# 创建dataframe
df = DataFrame(data=dic)

print(df)

# 第二种方法,使用列表存储天团信息
list = [['小罗伯特·唐尼', '钢铁侠', '钢铁战衣', '和平,我热爱和平'],
        ['克里斯·埃文斯', '美国队长', '盾牌', '最好的武器是重新开始'],
        ['斯嘉丽·约翰逊', '黑寡妇', '寡妇蛰', '嘿,大兄弟,太阳下山了'],
        ['克里斯·海姆斯沃斯', '雷神', '雷神之锤', '要用知识打败无知']]
# 创建dataframe
df = DataFrame(data=list,index=[0,1,2,3],columns=['姓名','角色','武器','语录'])
print(df)

 # 输出结果:
           姓名    角色    武器           语录
0    小罗伯特·唐尼   钢铁侠  钢铁战衣     和平,我热爱和平
1    克里斯·埃文斯  美国队长    盾牌   最好的武器是重新开始
2    斯嘉丽·约翰逊   黑寡妇   寡妇蛰  嘿,大兄弟,太阳下山了
3  克里斯·海姆斯沃斯    雷神  雷神之锤     要用知识打败无知
  1. 记录备忘录信息
from pandas import Series,DataFrame

# 创建索引
index_list = ['NO1','NO2','NO3']
# 创建字典
dic = {'姓名':Series(['娜娜','小红','依依'],index=index_list),
       '类型':Series(['可爱单纯','风骚火辣','性感高冷'],index=index_list),
       '爱好':Series(['逛街、电影、爱吃甜','喝酒、蹦迪、爱吃辣','看书、烘焙、爱吃酸'],index=index_list),
       '时间':Series(['2019-2-14去蹦迪','2019-2-16去吃饭','2019-2-18去死的时候'],index=index_list)}

df = DataFrame(dic)
print(df)

# 第二种方法,创建列表,存储信息
se1 = ['娜娜','可爱单纯','逛街、电影、爱吃甜','2019-2-14去蹦迪']
se2 = ['小红','风骚火辣','喝酒、蹦迪、爱吃辣','2019-2-16去吃饭']
se3 = ['依依','性感高冷','看书、烘焙、爱吃酸','2019-2-18去死的时候']

series_list = [se1,se2,se3]
# 创建Dataframe
df = DataFrame(data=series_list,index=['NO1','NO2','NO3'],columns=['姓名','类型','爱好','时间'])
print(df)

# 输出结果:
     姓名    类型         爱好              时间
NO1  娜娜  可爱单纯  逛街、电影、爱吃甜    2019-2-14去蹦迪
NO2  小红  风骚火辣  喝酒、蹦迪、爱吃辣    2019-2-16去吃饭
NO3  依依  性感高冷  看书、烘焙、爱吃酸  2019-2-18去死的时候
  1. 根据公司的员工信息登记表数据,获取相关信息:
    1. 获取工号为003~007的所有员工信息;
    2. 获取所有员工的年龄和工资信息;
    3. 查看一个你感兴趣员工的婚姻状况。
from pandas import Series,DataFrame
index_list = ['001','002','003','004','005','006','007','008','009','010']
name_list = ['李白','王昭君','诸葛亮','狄仁杰','孙尚香','妲己','周瑜','张飞','王昭君','大乔']
age_list = [25,28,27,25,30,29,25,32,28,26]
salary_list = ['10k','12.5','20k','14k','12k','17k','18k','21k','22k','21.5k']
marital_list = ['NO','NO','YES','YES','NO','NO','NO','YES','NO','YES']
dic={
    '姓名': Series(data=name_list,index=index_list),
    '年龄': Series(data=age_list,index=index_list),
    '薪资': Series(data=salary_list,index=index_list),
    '婚姻状况': Series(data=marital_list,index=index_list)
    }
df = DataFrame(data=dic,index=index_list)
# 获取工号003-007的所有员工信息
print(df.loc['003':'007'])
print('-'*20)
# 获取所有员工的年龄和工资信息
print(df.loc[:,['年龄','薪资']])
print('-'*20)
# 随意查看某个感兴趣的员工的婚姻状况
print(df.loc[['002'],['姓名','婚姻状况']])

# 输出结果:
      姓名  年龄   薪资 婚姻状况
003  诸葛亮  27  20k  YES
004  狄仁杰  25  14k  YES
005  孙尚香  30  12k   NO
006   妲己  29  17k   NO
007   周瑜  25  18k   NO
--------------------
     年龄     薪资
001  25    10k
002  28   12.5
003  27    20k
004  25    14k
005  30    12k
006  29    17k
007  25    18k
008  32    21k
009  28    22k
010  26  21.5k
--------------------
      姓名 婚姻状况
002  王昭君   NO

  1. 根据练习3的信息,用三种方法遍历获取所有员工的薪资信息;获取最高薪水值
from pandas import Series,DataFrame
index_list = ['001','002','003','004','005','006','007','008','009','010']
name_list = ['李白','王昭君','诸葛亮','狄仁杰','孙尚香','妲己','周瑜','张飞','王昭君','大乔']
age_list = [25,28,27,25,30,29,25,32,28,26]
salary_list = ['10k','12.5','20k','14k','12k','17k','18k','21k','22k','21.5k']
marital_list = ['NO','NO','YES','YES','NO','NO','NO','YES','NO','YES']
dic={
    '姓名': Series(data=name_list,index=index_list),
    '年龄': Series(data=age_list,index=index_list),
    '薪资': Series(data=salary_list,index=index_list),
    '婚姻状况': Series(data=marital_list,index=index_list)
    }
df=DataFrame(data=dic,index=index_list)

# 第一种方法,df[]
list2 = []
for value in df['薪资']:
    print(value)
    # 获取最大值
    list2.append(value)
print(max(list2))
print('-'*20)
# 第二种方法,标签索引
for value in df.loc[:,'薪资']:
    print(value)
print('-'*20)
# 第三种方法,位置索引
for value in df.iloc[:,2]:
    print(value)
print('-'*20)
# 第四种方法,遍历行
for index,row_data in df.iterrows():
    print(row_data['薪资'])
print('-'*20)
# 第五种方法,遍历列
for co,col_data in df.iteritems():
    if co == '薪资':
        print(col_data)
print('-'*20)
# 获取最大值
list1 = []
for co,col_data in df.iteritems():
    if co =='薪资':
        for salary in col_data:
            list1.append(salary)
print(max(list1))


# 输出结果:
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
22k
--------------------
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
--------------------
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
--------------------
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
--------------------
001      10k
002     12.5
003      20k
004      14k
005      12k
006      17k
007      18k
008      21k
009      22k
010    21.5k
Name: 薪资, dtype: object
--------------------
22k
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章