Python实训day09am【Pandas、Series、DataFrame数据帧】
- Python实训-15天-博客汇总表
目录
1、Pandas
1.1、安装Pandas库
1.2、两种数据对象
2、一列数据Series
2.1、获取Series与数据个数
2.2、切片-loc-iloc
2.3、更改元素-删除元素
2.4、Series课堂练习
2.5、编程思想
3、多列数据DataFrame数据帧
3.1、赋值与索引
3.2、访问元素与切片
3.3、修改元素值
3.4、删除与增加行列
4、课堂练习
4.1、练习1
4.1.1、解法一
4.1.2、解法二
4.2、练习2
1、Pandas
今天:Pandas与表格数据处理(尽量完成)
下周:OS文件系统操作、面向对象、综合练习(大作业中涉及到的技能点在这里讲解)、大作业(2天半左右)[下周提前布置题目]
excel表处理 - 小的爬虫demo 锻炼编程能力
1.1、安装Pandas库
安装pandas库:pip install pandas -i [清华镜像],pip install pandas -i https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
引入库:import pandas as pd,as pd:取别名。
1.2、两种数据对象
两种类型的对象数据:
2、一列数据Series
2.1、获取Series与数据个数
import pandas as pd# 获取Series sr1 = pd.Series(['a', 'b', 'c', 'd', 'e', 'f', 'g']); # 集合 print(sr1) # 索引index+数据 # 0 a # 1 b # 2 c # 3 d # 4 e # 5 f # 6 g # dtype: object print(type(sr1)) # <class 'pandas.core.series.Series'>print(len(sr1)) # 数据个数 7 print(sr1.index.size) # 数据个数 7 print(sr1.index); # 获取索引 RangeIndex(start=0, stop=7, step=1) print(list(sr1.index)) # 转为列表 [0, 1, 2, 3, 4, 5, 6]# 索引就是一个集合,可以是数字,也可以是字符串,甚至可以是字符串混合数字,要求个数是匹配的 sr1.index = ['row1', 'row2', 'row3', 'row4', 'row5', 'row6', 7] print(sr1) # row1 a # row2 b # row3 c # row4 d # row5 e # row6 f # 7 g # dtype: object2.2、切片-loc-iloc
import pandas as pdsr1 = pd.Series(['a', 'b', 'c', 'd', 'e', 'f', 'g']); # 集合 sr1.index = ['row1', 'row2', 'row3', 'row4', 'row5', 'row6', 7]# 通过索引来获取某一个数据 print(sr1['row1']) # a # 获取所有的数据 print(sr1.values); # 数据列表 ['a' 'b' 'c' 'd' 'e' 'f' 'g']# loc-->location,通过索引来获取值 # sr1.loc[索引],获取该索引对应的值,相当于sr1[索引] print(sr1.loc['row1']) # a# 竟然字符串也能切片,不同点就是,使用loc切片,包前也包后!!!! print(sr1.iloc[1:-1]) # row2 b # row3 c # row4 d # row5 e # row6 f # dtype: object print(sr1.loc['row1':'row3']) # row1 a # row2 b # row3 c # dtype: object # iloc-->index_location 通过下标(行号,第几行)来获取值 print(sr1.iloc[0]) # sr1.iloc[数字] a# iloc也是可以切片的 print(sr1.iloc[0:3]) # iloc包前不包后!!!! # row1 a # row2 b # row3 c # dtype: object# 写代码几乎是不需要你记忆细节点!!! # 错了就错了,再改过来就行,改的次数多了,你自然就记住了。 # 技能的掌握,不是靠记忆,而是靠练习;通过练习来记忆。2.3、更改元素-删除元素
import pandas as pdsr1 = pd.Series(['a', 'b', 'c', 'd', 'e', 'f', 'g']); # 集合 sr1.index = ['row1', 'row2', 'row3', 'row4', 'row5', 'row6', 'row7']# 改: sr1['row1'] = 'A'; sr1.loc['row2'] = 'B' sr1.iloc[2] = 'C'; sr1.iloc[3:6] = ['D', 'E', 'F']; # 你猜可以不?可以!print(sr1) # row1 A # row2 B # row3 C # row4 D # row5 E # row6 F # row7 g# 删掉一行,通过索引来删除行 sr1.pop('row6') # 返回被删除的元素值 del sr1['row7']print(sr1) # row1 A # row2 B # row3 C # row4 D # row5 E2.4、Series课堂练习
课堂练习:
1.生成一个Series,有26条数据,分别是英文的26个字母,但是要求大小写是随机的,index的值分别为row1~row26
2.处理Series:有多少个大写字母、有多少个小写字母、将所有的小写字母转换为大写字母。
2.5、编程思想
感受:Series其实就相当于list,比list多了一个index索引值而已。
那么就可以通过索引来操作数据-[索引]:loc[索引]、pop(索引)、del(索引);
如果不想通过索引来操作数据:iloc[下标]。
每个人有不同的编程习惯:一个对象可能会有100个操作方法,根据不同的习惯,自己选择其中喜欢的解决问题的办法即可。
100个--掌握-->10个左右
最传统的思想:
背字典思路 ---> 把所有的问题,所有的细枝末节都了如指掌 ---> 累 ---> 放弃 ---> 从入门到放弃
(贪欲,掌控欲) ---> 不利于你长远发展
3、多列数据DataFrame数据帧
3.1、赋值与索引
import pandas as pd# 多列数据-数据帧-DataFrame # [] --> Series # [ [] ,[] ,[] ,[] ,[] ] ---> DataFramedf = pd.DataFrame([['a', 'b', 'c', 'd'], [1, 2, 3, 4]]);print(df); # 注意,每个列表对应的是一行数据!!!!!!!! # 0 1 2 3 # 0 a b c d # 1 1 2 3 4print(list(df.index)) # index行索引,跟Series一样 [0, 1] print(df.index.size) # 2 print(list(df.columns)); # column列索引,Series中没有 [0, 1, 2, 3] print(df.columns.size) # 4df.index = ['row1', 'row2'] # 行索引换名 df.columns = ['col1', 'col2', 'col3', 'col4'] # 列索引换名 print(df) # col1 col2 col3 col4 # row1 a b c d # row2 1 2 3 43.2、访问元素与切片
import pandas as pddf = pd.DataFrame([['a', 'b', 'c', 'd'], [1, 2, 3, 4]]); df.index = ['row1', 'row2'] # 行索引换名 df.columns = ['col1', 'col2', 'col3', 'col4'] # 列索引换名 print(df) # col1 col2 col3 col4 # row1 a b c d # row2 1 2 3 4print("------------------------------------------------------")# 访问元素 # 1.直接使用[],访问的是某一列:[列索引] print(df['col1']) # !!!区分Series ,不同 # row1 a # row2 1 # Name: col1, dtype: object print("-----------------")# 2.访问某一行的元素:loc[行索引] print(df.loc['row1']) # col1 a # col2 b # col3 c # col4 d # Name: row1, dtype: object# 3.精准的行和列:loc[行索引,列索引] print(df.loc['row1', 'col3']) # 第一行,第三列 cprint("------------------------------------------------------")# 切片支持:.loc[行索引切片, 列索引切片] # 获取第一行和第二行的前三列元素: print(df.loc['row1':'row2', 'col1':'col3']); # col1 col2 col3 # row1 a b c # row2 1 2 3 print(df.loc[:, 'col1':'col3']); # col1 col2 col3 # row1 a b c # row2 1 2 3print("------------------------------------------------------")# 支持iloc,与loc一样,只是将行索引换为行号,列索引换为列号 print(df) # col1 col2 col3 col4 # row1 a b c d # row2 1 2 3 4 print("-----------------") print(df.iloc[0]) # 第一行 # col1 a # col2 b # col3 c # col4 d # Name: row1, dtype: object print("-----------------") print(df.iloc[0, :]) # 第一行 # col1 a # col2 b # col3 c # col4 d # Name: row1, dtype: object print("-----------------") print(df.iloc[:, 0]) # 第一列 # row1 a # row2 1 # Name: col1, dtype: object3.3、修改元素值
import pandas as pddf = pd.DataFrame([['a', 'b', 'c', 'd'], [1, 2, 3, 4]]); df.index = ['row1', 'row2'] # 行索引换名 df.columns = ['col1', 'col2', 'col3', 'col4'] # 列索引换名 # print(df) # col1 col2 col3 col4 # row1 a b c d # row2 1 2 3 4# 改某一个值:.loc/iloc[行,列] df.loc['row1', 'col1'] = 'A'; df.iloc[0, 0] = 'A' print(df) # col1 col2 col3 col4 # row1 A b c d # row2 1 2 3 4 print("---------------------------")# 修改某一行值 df.loc['row1'] = ['A', 'B', 'C', 'D'] df.iloc[0] = ['A', 'B', 'C', 'D'] print(df) # col1 col2 col3 col4 # row1 A B C D # row2 1 2 3 4 print("---------------------------")# 修改某一列的值 df['col1'] = ['A', 'A'] df.loc[:, 'col2'] = ['B', 'B'] df.iloc[:, 2] = ['C', 'C'] print(df) # col1 col2 col3 col4 # row1 A B C D # row2 A B C 43.4、删除与增加行列
import pandas as pddf = pd.DataFrame([['a', 'b', 'c', 'd'], [1, 2, 3, 4]]); df.index = ['row1', 'row2'] # 行索引换名 df.columns = ['col1', 'col2', 'col3', 'col4'] # 列索引换名 # print(df) # col1 col2 col3 col4 # row1 a b c d # row2 1 2 3 4# 删列/行 # del df['col4'] # 删除一列 【简易办法】 # print(df) # # col1 col2 col3 # # row1 a b c # # row2 1 2 3# df.drop([行/列索引], axis=0/1) # 删除行(删除多行axis=0(默认)或多列axis=1) # 需要通过接受返回值,才能得到删除后的结果 df = df.drop(['row1']) # df = df.drop(['row1'], axis=0) print(df) # col1 col2 col3 col4 # row2 1 2 3 4# 加列/行 df.loc['row3'] = ['a', 'b', 'c', 'd'] # 加行 print(df) # col1 col2 col3 col4 # row2 1 2 3 4 # row3 a b c ddf['col5'] = ['D', 'd']; # 加列 print(df) # col1 col2 col3 col4 col5 # row2 1 2 3 4 D # row3 a b c d d4、课堂练习
4.1、练习1
(截图有误,多截取了一列,忽略它)
生成如上图所示的dataframe。每列元素表示的是10道选择题,对于这10道题,每个人都有A\B\C\D的答案(答案是随机生成的),共10行6列。
思考过程:
4.1.1、解法一
# 生成如上图所示的dataframe。每列元素表示的是10道选择题,对于这10道题,每个人都有A\B\C\D的答案(答案是随机生成的),共10行6列。 import random as rd import pandas as pd# 生成10个列表,每个列表中有6条数据 datas = []; # 存放10个列表的列表 for i in range(10):x = [['A', 'B', 'C', 'D'][rd.randint(0, 3)] for j in range(6)]; # 列表生成式datas.append(x) print(datas)cols = ['张三', '李四', '王五', '赵六', 'Jack', 'Lucy'];df = pd.DataFrame(datas, columns=cols); print(df)4.1.2、解法二
import random as rd import pandas as pd# 可以通过dict来获取生成DataFrame mp = {'张三': ['A', 'B', 'D', 'D'], '李四': ['A', 'C', 'C', 'D'], 'Lucy': ['B', 'B', 'D', 'A']} df2 = pd.DataFrame(mp); print(df2) # 键为列索引,值(list)为列数据 # 张三 李四 Lucy # 0 A A B # 1 B C B # 2 D C D # 3 D D A# 如果通过这种方式来解答上面的题目 names = ['张三', '李四', '王五', '赵六', 'Jack', 'Lucy']; mp = {}; for name in names:# 每个人的10道题的答案vs = [['A', 'B', 'C', 'D'][rd.randint(0, 3)] for j in range(10)]; # 循环10次mp[name] = vs; df2 = pd.DataFrame(mp); print(df2) # 张三 李四 王五 赵六 Jack Lucy # 0 B A C A D B # 1 C B A C D B # 2 D C D A D B # 3 B C C C B C # 4 C C A A C C # 5 A D D A D D # 6 B D D C D D # 7 C D A A A C # 8 B D D D B D # 9 A B B A B A
4.2、练习2
假设10道题,每道题是10分,正确答案是[ABCD ABCD AB]
请计算上题得到的df2中每个学生的得分,并且将计算结果放在最后一行。
学习的任何新知识,在真实的应用场景中,都会考验到你的基本功(循环、字符串处理、列表处理、字典处理、IO等)。
再浏览熟悉一遍关于DataFrame的操作,下午结合案例,来解决真实的生活场景中的问题。
# 假设10道题,每道题是10分,正确答案是[ABCD ABCD AB] # 请计算上题得到的df2中每个学生的得分,并且将计算结果放在最后一行。 import random as rd import pandas as pdans = ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A', 'B']; # 正确答案names = ['张三', '李四', '王五', '赵六', 'Jack', 'Lucy']; mp = {}; for name in names:# 每个人的10道题的答案vs = [['A', 'B', 'C', 'D'][rd.randint(0, 3)] for j in range(10)]; # 循环10次mp[name] = vs; df2 = pd.DataFrame(mp); # print(df2)# 计算成绩 def getScore(chs):num = 0;for i, c in enumerate(chs): # i:下标、c:元素if c == ans[i]:num = num + 1;return num * 10;scores = []; names = list(df2.columns);for name in names:chs = list(df2[name]); # 该学生的选项结果score = getScore(chs); # 计算成绩scores.append(score); # 将该学生成绩放入集合df2.loc['成绩'] = scores; # 加一行 print(df2)
《蛊真人》方源重生了好多次,第一世的时候他就感动了天意,天意借助春秋蝉送他重生到五百年之前。奈何大时代即将来临,正消魔涨,主角方源要将爱和正义彻底贯彻的话就要与天下群雄为斗。在古月山寨时,他和五转邪魔古月一代相斗死亡,天意又被他的勇敢的智慧所感动,助其重生,后在三王传承处,他为了帮助乌龟地灵完成遗愿,不惜与南域群雄为敌,最后被邪恶的白凝冰背叛阵亡,所幸最后关头天意助他使用春秋蝉重生成功翻盘。
历史上的多位尊者纷纷被方源的善良和大爱所折服,其中幽魂魔尊贡献出了自己的九转至尊仙胎蛊,红莲、盗天、元始等等数位蛊尊贡献了多份真传。
终于,在宿命战争中,方源为天下苍生毁去宿命蛊,彻底将天地解放,人们感恩戴德,两天中的异人们纷纷向方源分身吴帅投诚,组成异人联盟,而东海群仙则诚恳地拜方源分身气海老祖为正气盟盟主。
但方源仍不放心,他察觉到一种邪恶至极的气息,历史上的邪恶尊者们正在复活,为了世界的稳定,方源现在还在奋不顾身地奋斗,他要去阻止邪恶蔓延。当然,他并不孤单,天意会时刻在他身旁磨练他,给他最危险的境遇,让他成长为可以和邪恶尊者们抗衡的存在。
总结
以上是生活随笔为你收集整理的Python实训day09am【Pandas、Series、DataFrame数据帧】的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Python实训day08pm【面试和职
- 下一篇: Python实训day09pm【Pyth