接上篇,画图告一段落,现在学习表格的各种操作。
3.8 表格操作
3.8.1 表的校验
表里有些列的数据是有一定的要求的,比如说下面这个表,Score分数列,要求成绩只能是0到100,那如果有出现错误的数据,就需要校验出来。
首先还是导入库,并且读入文件:
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两列:
除了把列分开,数据也要根据自己的格式来进行分离,比如这里名和姓都是用空格分开的。
首先依然导入库和读入文件:
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次测试成绩:
首先依然导入库和读入文件:
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里最后有重复的名字,现在想去掉重复的行。
首先依然导入库和读入文件:
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')
好,先学到这,后面继续学习其他操作