数据分析师的学习之路-pandas篇(6)

接上篇,画图告一段落,现在学习表格的各种操作。

3.8 表格操作

3.8.1 表的校验

表里有些列的数据是有一定的要求的,比如说下面这个表,Score分数列,要求成绩只能是0到100,那如果有出现错误的数据,就需要校验出来。
数据分析师的学习之路-pandas篇(6)_第1张图片
首先还是导入库,并且读入文件:

import pandas as pd
students = pd.read_excel("C:/tmp/1.xlsx")

校验还是可以利用dataframe的apply方法,可以传入一个函数进去进行校验,所以先写一个校验的函数:

#传入一行数据(Series),用断言判断成绩范围,不在的话就抛出异常并打印信息。
def score_validation(row):
	try:
		assert 0 <= row.Score <= 100
	except:
		print(f"#{row.ID} student {row.Name} has an invalid score {row.Score}")

然后就利用dataFrame的apply方法来校验每一行,这里有个基本概念,就是dataframe遍历时有两个轴的方向,一个是左右一行一行扫描,一个是上下一列一列的扫描,对应的参数是 axis,如果为0就是上下一列一列扫描,如果是1就是左右一行一行扫描。这里的校验函数写的逻辑是一行一行扫描,所以参数axis为1:

students.apply(score_validation, axis=1)

这样就会找出Score有错误的数据,并打印出来。

3.8.2 分列

要把一列分成两列,比如这个例子里,要把Full Name的列,分成First Name和 Last Name两列:
数据分析师的学习之路-pandas篇(6)_第2张图片数据分析师的学习之路-pandas篇(6)_第3张图片
除了把列分开,数据也要根据自己的格式来进行分离,比如这里名和姓都是用空格分开的。

首先依然导入库和读入文件:

import pandas as pd
employees = pd.read_excel("C:/tmp/1.xlsx", index_col='ID')

先准备一个中间结果

#这里dataFrame获得该列的Series并用string的分割方法来完成两列数据的分割
#split通过空格来分割,expand设为True,最后就只保留我们想要的两个list
df = employees["Full Name"].str.split(' ', expand=True)
#然后添加新的两列就是:
employees['First Name'] = df[0]
employees['Last Name'] = df[1]

3.8.3 统计分析

经常会遇到求一些基本的统计分析数据,比如总和、均值等,现在例子是学生的3次测试成绩:
数据分析师的学习之路-pandas篇(6)_第4张图片
首先依然导入库和读入文件:

import pandas as pd
students= pd.read_excel("C:/tmp/1.xlsx", index_col='ID')

现在需要计算Test这3列的数据,不要其他列,那就得先拿这个表的一个子集来继续操作:

#students['Test_1']这样是拿到一列数据,即Series,
#里面放个list,就是拿到多列数据,还是dataFrame
#所以这样的方式就拿到了一个子集temp
temp = students[['Test_1', 'Test_2', 'Test_3']]

然后,就是在这个子集表的上面进行各种数据统计

#这样调用,是按列累加总和,result最终是个Series,分别对应3列的总和的值
result = temp.sum()

而我们现在是想得到一个学生的3次测试成绩,得横着加,那么上上一节说过,左右横着一行一行扫描,得设轴axis为1,所以:

#加上axis参数并设为1,这样就是一行这3列的总和了
row_sum = temp.sum(axis=1)
#求这一行的平均值,就换个函数
row_mean = temp.mean(axis=1)
#以此类推,其他统计方法都可以调用具体的函数,插pandas文档都能找到,搜一下也行。

3.8.4 消除重复数据

这个场景也经常出现,比如这个数据里Name里最后有重复的名字,现在想去掉重复的行。
数据分析师的学习之路-pandas篇(6)_第5张图片
首先依然导入库和读入文件:

import pandas as pd
students= pd.read_excel("C:/tmp/1.xlsx", index_col='ID')

去重复,也有现成函数调用

#去掉Name列重复的行
students.drop_duplicates(subset='Name', inplace=True, keep='first')

如果要对多行去重,就在subset参数里给一个list就行。
keep参数意思是重复的数据,要保留第1次出现还是最后一次出现的,可以设first,或者last

如果只是想找到重复的数据,而不删除,那就换个方法:

dupe = students.dublicated(subset='Name')

此时dupe变量的值代表每行是不是有重复,有重复的行就是True,没有的行就是False,长这样,最后5行和前面有重复,就变成了True。

>>> students.duplicated()
0    False
1    False
2    False
... ...
19   True
20   True
21   True
22   True
23   True
dtype: bool

只是判断一下有没有重复数据,就调用这个

#any函数
print(dupe.any())

如果想过滤一下,只要重复的数据就是:

dupe = dupe[dupe == True] #可以简写为  dupe = dupe[dupe] ,但是读起来不好理解
#然后就可以定位到重复的数据
students.iloc[dupe.index]

3.8.5 旋转行列

想把一个表的行列旋转一下,行变列,列变行。
首先依然导入库和读入文件:

import pandas as pd
students= pd.read_excel("C:/tmp/1.xlsx", index_col='ID')

这里读的时候一定要设置一下index,不然会自动加一列index,导致旋转的时候多了一行。

#旋转就调用一个函数就可以了
table = students.transpose()

3.8.6 导入csv、tsv和txt文件

1、读csv文件
csv文件的读入pandas有函数可以直接用:

students1 = pd.read_csv("C:/tmp/1.csv", index_col='ID')

2、读tsv文件
tsv文件没有专门的函数,还是用csv的函数,只不过可以自定义数据分隔符就能读了,tsv文件的数据分隔符是制表符:

students2 = pd.read_csv("C:/tmp/2.tsv", sep='\t', index_col='ID')

3、读txt文件
txt文件还是用csv的函数,还是用自定义分隔符,一般分隔符用 | 字符:

students3 = pd.read_csv("C:/tmp/3.txt", sep='|', index_col='ID')

好,先学到这,后面继续学习其他操作

你可能感兴趣的:(数据分析学习,学习,pandas,python,数据分析)