数据分析与可视化 实践基础练习四 (Pandas)


一、本节需掌握的Pandas相关函数或属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1. Series和DataFrame数据类型的创建

# Series创建(可以是列表,标量值,字典,ndarray,其他函数),index是行索引
pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath)

# DataFrame创建(有行索引和列索引,其类型可以是列表,字典,元组或Series,n维的ndarray)
eg. pd.DataFrame(np.arange(10).reshape(2,5))

2. Series的基本操作(类似ndarray,字典类型的操作)
可通过自定义索引列表来切片,自定义索引访问,get()方法

3. DataFrame数据查找、增加、删除和修改

d[ ['col_1','col_2'] ] # 通过列索引或以属性的方式可单独或取DataFrame的列数据
d[0:2] # 切片方式,取0到1行

head(),tail() # 获取连续的数据
loc(),iloc() # 一个是跟行/列索引名(或是条件查询)loc的切片方式是闭区间,一个是跟行/列索引下标

append() # 增加一行数据
insert() # 可插入新的一列数据

drop() #删除, !!!稍微特殊:axis为1是按列删,0是按行删
set_index() #更换索引

直接修改是对DataFrame数据修改
replace() # 对数据进行替换,以字典形式
rename() # 修改列名,需传入需要修改列名的字典
eg. d.rename(colmus={'城市':'city'}),inplace=True) # 将右值赋给左值,加上布尔值是否要替换

4. DataFrame索引重建reindex( )
.reindex(index=None, columns=None, fill_value...) #可进行新的自定义索引,填充指定值

二、实训案例

1. Pokemon宠物小精灵数据初步探索。

Pokemon数据集下载

案例中使用宠物小精灵的相关数据进行分析,其中各列的列名意义为:

img-202304011253221

· name:宠物小精灵的名称

· Type 1:宠物小精灵的第一类型 Type 2:宠物小精灵的第二类型

· Total:综合能力(生命点数、攻击强度、防御强度、特殊攻击强度、特殊防御强度和速度的总和)

· HP:生命点数

· Attack:攻击强度 Defense:防御强度

· Sp.Atk:特殊攻击强度 Sp.Def:特殊防御强度

· Speed:速度 Generation:世代数

· Lengendary:True表示为传奇小精灵,False表示非传奇小精灵


2. 结合数据集完成以下相关操作。

(1)读取Pokemon.csv文件;

(2)展示数据前10行;

(3)删除名为“#”的列;

(4)将各列名改为中文, 参数inplace设置替换原数据;

(5)分别查看数据表的行、列索引;

(6)查看第一类型的唯一值;

(7)查看行标签为2、4小精灵的名称和综合能力;

(8)查看行标签为5到10小精灵的名称和综合能力;

(9)通过切片方式查看前6个小精灵的数据;

(10)查看攻击强度大于160的小精灵的所有数据;

(11)查看传奇小精灵的数据,只展示前十行数据;

(12)创建新列“能力600”,插入到综合能力一列的后面,该列显示综合能力大于等于600的为True,小于600为False;

(13)创建新列“世代456”,插入到最后一列,该列显示世代数为4、5和6的小精灵为True, 其他为False,随机选取10行数据进行展示。


三、题解

1
2
3
4
5
6
7
# (1)读取Pokemon.csv文件;

import pandas as pd

pd.set_option('display.unicode.east_asian_width', True)
d = pd.read_csv('Pokemon.csv',sep = ',') # 读取文件
d.head() # 默认输出前5行数据

001


1
2
3
# (2)展示数据前10行;

d.head(10)

002


1
2
3
4
# (3)删除名为“#”的列;

d.drop('#', axis = 1, inplace = True) # 确认替换原数据
d.head()

003


1
2
3
4
5
# (4)将各列名改为中文, 参数inplace设置替换原数据;

# 传入字典类型值
d.rename(columns={'Name':'名称', 'Type 1':'第一类型', 'Type 2':'第一类型', 'Total':'综合能力', 'HP':'生命点数', 'Attack':'攻击强度', 'Defense':'防御强度', 'Sp.Atk':'特殊攻击强度', 'Sp.Def':'特殊攻击强度', 'Speed':'速度', 'Generation':'世代数', 'Legendary':'传奇小精灵', }, inplace = True)
d.head()

004


1
2
3
4
# (5)分别查看数据表的行、列索引;

list(d.index) # 共800行
list(d.columns) # 输出列索引
1
2
3
4
5
6
7
8
9
10
11
12
['名称',
'第一类型',
'第一类型',
'综合能力',
'生命点数',
'攻击强度',
'防御强度',
'Sp. Atk',
'Sp. Def',
'速度',
'世代数',
'传奇小精灵']

1
2
3
4
5
6
# (6)查看第一类型的唯一值;

d['第一类型'].nunique()
# nunique统计去重后元素的个数(过滤掉nan,但会统计空字符串)
# unique统计去重后所有元素(包含nan以及空字符串)
# value_counts()是Series拥有的方法,一般在DataFrame中使用时,需要指定对哪一列或行
1
2
第一类型    18
dtype: int64

1
2
3
# (7)查看行标签为2、4小精灵的名称和综合能力;

d.loc[ [2, 4], ['名称', '综合能力'] ]
007
1
2
3
# (8)查看行标签为5到10小精灵的名称和综合能力;

d.iloc[ 5:11, [0, 3] ] # 名称和综合能力分别在第0列和第3列
008
1
2
3
# (9)通过切片方式查看前6个小精灵的数据;

d.loc[0:5] # 索引值是闭区间

009


1
2
3
# (10)查看攻击强度大于160的小精灵的所有数据;

d.loc[d['攻击强度'] > 160] # 条件查询,返回结果为True的那些行

010


1
2
3
4
#  (11)查看传奇小精灵的数据,只展示前十行数据;

d1 = d.loc[d['传奇小精灵'] == True]
d1.head(10) # 或者 d[d['传奇小精灵'] == True].head(10)

011


1
2
3
4
5
# (12)创建新列“能力600”,插入到综合能力一列的后面,该列显示综合能力大于等于600的为True,小于600为False;

col_new = '能力600'
d.insert(4, col_new, d['综合能力'] > 600) # insert()用于插入列(参数跟插入列后的位置,列索引名,插入的值)
d

012


1
2
3
4
5
# (13)创建新列“世代456”,插入到最后一列,该列显示世代数为4、5和6的小精灵为True, 其他为False,随机选取10行数据进行展示。

col_new1 = '世代456'
d.insert(13, col_new1, d['世代数'].isin([4,5,6]) ) # 最后一列的下标是12, isin()接受一个列表,来判断该列中元素是否在列表中
d.sample(10) # sample()用于从DataFrame中随机选择行或列

013


四、参考资料

Pokemon数据集

Pandas统计函数count,unique,nunique的区别