前言1.pandas的安装2.数据结构
2.1 一维结构(Series)2.2 二维结构(Dataframe) 3.数据查看4.数据输入和输出
4.1 csv4.2 Excel 5.数据选择
5.1 字段数据
5.1.1 列的获取5.1.2 行的获取5.1.3 数值的获取5.1.4 切片 *** 作 5.2 boolean索引5.3 赋值 *** 作
5.3.1 新增一列5.3.2 整列的变化5.3.3 列上元素的变化5.3.4 批量 *** 作多个数据 6.训练场
6.1 创建1000条语、数、外、Python的考试成绩Dataframe,范围是0~150包含150,分别将数据保存到csv文件以及Excel文件,保存时不保存行索引。6.2 创建使用字典创建Dataframe,行索引是a~z,列索引是:身高(160-185)、体重(50-90)、学历(无、本科、硕士、博士)。身高、体重数据使用NumPy随机数生成,学历数据先创建数组 edu =np.array(['无','本科','硕士','博士']),然后使用花式索引从四个数据中选择26个数据。6.3 使用题目二中的数据,进行数据筛选。
6.3.1 筛选索引大于 't' 的所有数据6.3.2 筛选学历是博士,身高大于170或者体重小于80的学生 6.4 使用题目二中数据,开始学生们开始减肥
6.4.1 本科生减肥,减掉的体重统一是106.4.2 博士生减肥,减掉体重范围是5~10
前言
本文其实属于:Python的进阶之道【AIoT阶段一】的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 pandas 入门,后续还会单独发一篇 pandas 高级以及 pandas 进阶内容供读者学习。
Python在数据处理和准备方面一直做得很好,但在数据分析和建模方面就差一些。pandas帮助填补了这一空白,使您能够在Python中执行整个数据分析工作流程,而不必切换到更特定于领域的语言,如R。与出色的 jupyter工具包和其他库相结合,Python中用于进行数据分析的环境在性能、生产率和协作能力方面都是卓越的。pandas是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。pandas是Python进行数据分析的必备高级工具。pandas的主要数据结构是 Series(一维数据)与 Dataframe(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数案例处理数据一般分为几个阶段:数据整理与清洗、数据分析与建模、数据可视化与制表,Pandas 是处理数据的理想工具。
学习本文之前,需要先自修:NumPy从入门到进阶,本文中很多的 *** 作在 NumPy从入门到进阶 一文中有详细的介绍,包含一些软件以及扩展库,图片的安装和下载流程,本文会直接进行使用。
1.pandas的安装Windows + R,输入 cmd,输入 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple 下载 pandas,如果你曾跟着NumPy从入门到进阶进行学习,这一步可以省略【已经安装好了 pandas】
安装好后,进入 jupyter,运行如下代码,没有报错证明安装成功:
import pandas as pd s = pd.Series(data = [9, 8, 7, 6], index = ['a', 'b', 'c', 'd']) display(s)
可以看到,我们创建了索引(index)为 'a' 'b' 'c' 'd',data 为9 8 7 6的一维结构,我们还可以不指定索引(index),那么就会默认为 0 1 2 ...
一维Series和之前NumPy有何不同呢?
区别在于索引,是一一对应的,即索引也可以拥有自己的“名字”,而NumPy则是:自然索引(0 ~ n)
import pandas as pd import numpy as np pd.Dataframe(data = np.random.randint(0, 150, size = (5, 3)))
默认的行索引和列索引也都是从0开始的,我们说过,pandas可以自己定义我们的索引:
import pandas as pd import numpy as np # columns 用来设置列索引,index 用来设置行索引 pd.Dataframe(data = np.random.randint(0, 150, size = (5, 3)), columns = ['Python', 'English', 'Math'], index = list('ABCDE'))
我们发现,表格中的数都是正数,我们可以用 dtype 属性设置为小数或者其他:
import pandas as pd import numpy as np # dtype 用来设置数的类型 pd.Dataframe(data = np.random.randint(0, 150, size = (5, 3)), columns = ['Python', 'English', 'Math'], index = list('ABCDE'), dtype = np.float32)
下面介绍另一种创建的方法:我们学过 Python 后,你可能会发现,在 Python 中的字典这种数据类型好像和这个特别像,故我们可以使用字典去进行创建:
import pandas as pd import numpy as np pd.Dataframe(data = {'Python':np.random.randint(100, 150, size = 5), 'English':np.random.randint(90, 130, size = 5), 'Math':np.random.randint(100, 150, size = 5)})
我们设置了列索引,接下来我们来设置行索引:
import pandas as pd import numpy as np pd.Dataframe(data = {'Python':np.random.randint(100, 150, size = 5), 'English':np.random.randint(90, 130, size = 5), 'Math':np.random.randint(100, 150, size = 5)}, index = list('ABCDE'))
我们当然可以对其进行排序,比如我们按照行索引的大小进行降序:
import pandas as pd import numpy as np df = pd.Dataframe(data = {'Python':np.random.randint(100, 150, size = 5), 'English':np.random.randint(90, 130, size = 5), 'Math':np.random.randint(100, 150, size = 5)}, index = list('ABCDE')) df.sort_index(ascending = False)3.数据查看
接下来来介绍一些查看数据的方法:
import numpy as np import pandas as pd # 创建 shape(150, 3)的二维标签数组结构Dataframe df = pd.Dataframe(data = np.random.randint(0, 151, size = (150, 3)), columns = ['Python', 'English', 'Math']) # 查看其属性、概览和统计信息 display(df.head(10)) # 显示头部10个,默认5个 display(df.tail(10)) # 查看末尾10个,默认5个 display(df.shape) # 查看形状,行数和列数 display(df.dtypes) # 查看数据类型 # 改变数据类型: # 把 'Python' 一列的数据类型由 int32 改为 int64 df['Python'] = df['Python'].astype(np.int64) display(df.dtypes) # 查看数据类型 display(df.index) # 查看行索引 display(df.columns) # 查看列索引
import numpy as np import pandas as pd df = pd.Dataframe(data = np.random.randint(0, 151, size = (150, 3)), columns = ['Python', 'English', 'Math']) display(df.values) # 查看对象值(即这个二维ndarray数组)
import numpy as np import pandas as pd df = pd.Dataframe(data = np.random.randint(0, 151, size = (150, 3)), columns = ['Python', 'English', 'Math']) # 查看数值类型列的汇总统计,计数、平均值、标准差、最小值、四分位数、最大值 display(df.describe()) # 查看列索引、数据类型、非空计数和内存信息 display(df.info())4.数据输入和输出 4.1 csv
我们想要存储数据,首先要创建数据:
import numpy as np import pandas as pd # 薪资情况: df = pd.Dataframe(data = np.random.randint(0, 50, size = (50, 5)), columns = ['IT', '化工', '生物', '教师', '士兵']) display(df)
import numpy as np import pandas as pd # 薪资情况: df = pd.Dataframe(data = np.random.randint(0, 50, size = (50, 5)), columns = ['IT', '化工', '生物', '教师', '士兵']) display(df) # 保存到当前路径下,文件名是:salary.csv df.to_csv('./salary.csv', sep = ';', # 文本分隔符,默认是逗号 header = True, # 是否保存列索引 index = True) # 是否保存行索引 # 保存行索引,文件被加载时,默认行索引会作为一列
点击该文件就可以查看保存的数据信息:
能保存数据自然就有加载数据的 *** 作:
pd.read_csv('./salary.csv', sep = ';', # 默认是逗号 header = [0], # 指定列索引 index_col = 0) # 指定行索引4.2 Excel
如果要保存为 Excel 文件,我们需要装两个库:
pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple
按下 Windows + R,输入 cmd,然后输入上述两行,如果你曾跟着NumPy从入门到进阶进行学习,这一步可以省略
import numpy as np import pandas as pd df1 = pd.Dataframe(data = np.random.randint(0, 50, size = [50,5]), # 薪资情况 columns = ['IT', '化工', '生物', '教师', '士兵']) # 保存到当前路径下,文件命名是:salary.xlsx df1.to_excel('./salary.xlsx', sheet_name = 'salary',# Excel中工作表的名字 header = True, # 是否保存列索引 index = False) # 是否保存行索引
这样我们就保存了 df1 的数据,并把文件存到了当前目录下:
注意这个文件我们在 jupyter 上是无法打开的,但是我们可以在文件管理中找到并打开:
接下来我们来读取这个文件:
pd.read_excel('./salary.xlsx', sheet_name = 0, # 读取哪一个Excel中工作表,默认第一个 header = 0) # 使用第一行数据作为列索引
我们还可以替换列索引,比如我们把列索引替换为 ABCDE
pd.read_excel('./salary.xlsx', sheet_name = 0, # 读取哪一个Excel中工作表,默认第一个 header = 0, # 使用第一行数据作为列索引 names = list('ABCDE'))# 替换列索引
我们还可以指定行索引:
pd.read_excel('./salary.xlsx', sheet_name = 0, # 读取哪一个Excel中工作表,默认第一个 header = 0, # 使用第一行数据作为列索引 names = list('ABCDE'), index_col = 1) # 替换列索引,index_col = 1 代表B作为行索引 # 感兴趣的读者可以自己运行一下:0 和 3 # index_col = 0 代表A作为行索引 # index_col = 3 代表D作为行索引
我们打开我们的 Excel 表格:
可以看到只有一个工作表,我们如果现在想再创建一个工作表用来存储其他数据,可以按下述 *** 作:
# 创建一组新的数据: # 计算机科目的考试成绩 df2 = pd.Dataframe(data = np.random.randint(0, 50, size = [150, 3]), columns=['Python', 'Tensorflow', 'Keras']) df2.to_excel('./salary.xlsx', sheet_name = 'test',# Excel中工作表的名字 header = True,# 是否保存列索引 index = False) # 是否保存行索引,保存行索引
我们再来查看一下我们的文件:
发现并没有实现我们预期的结果,下面来正式介绍一下如何 *** 作:
# 一个Excel文件中保存多个工作表 with pd.ExcelWriter('./data.xlsx') as writer: df1.to_excel(writer,sheet_name = 'salary', index = False) df2.to_excel(writer,sheet_name = 'score', index = False)
这样就实现了我们的存入 *** 作,接下来还是读取的 *** 作:
读取 salary:
pd.read_excel('./data.xlsx', sheet_name='salary') # 读取Excel中指定名字的工作表
读取 score:
pd.read_excel('./data.xlsx', sheet_name='score') # 读取Excel中指定名字的工作表5.数据选择 5.1 字段数据 5.1.1 列的获取
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(0, 150, size = (1000, 3)), columns = ['Python', 'English', 'Math']) display(df) # 获取 Python 一列的数据 # 方法一 display(df['Python']) # 方法二 display(df.Python) # 获取两列数据 display(df[['Python', 'Math']])
再来对比两个写法:同样是获得一列的数据,不同的写法对应的运行表现不同:
display(df['Python']) display(df[['Python']])5.1.2 行的获取
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(0, 150, size = (5, 3)), index = list('ABCDE'), columns = ['Python', 'English', 'Math']) # 获取 Python 一行的数据 display(df.loc['A']) # 获取 两行的数据 display(df.loc[['A', 'C']])
还有一种获取方法:
display(df.iloc[0]) # 按数字去获取,0就是对应'A' display(df.iloc[[0, 2]]) # 获取的是 'A' 和 'C'5.1.3 数值的获取
我们介绍了获取行和获取列,现在我们来介绍获取固定行固定列的元素:
# 获取第 B 行,第 Math 列的值 # 方法一 display(df['Math']['B']) # 方法二 display(df.loc['B']['Math']) # 方法三 display(df.loc['B', 'Math']) # 方法四 display(df.iloc[1, 2])5.1.4 切片 *** 作
切片的概念和表达都和 Python 的传统切片无差别,和 NumPy 也特别相似:
display(df.loc['A':'C']) display(df.loc['A':'C', 'English':]) display(df.iloc[1:2, 0:-1])5.2 boolean索引
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(0, 151, size = (1000, 3)), columns = ['Python', 'English', 'Math']) cnt = df['Python'] == 150 df[cnt]
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(0, 151, size = (1000, 3)), columns = ['Python', 'English', 'Math']) cnt1 = df['Python'] > 140 cnt2 = df['Math'] > 140 cnt = cnt1 & cnt2 df[cnt]5.3 赋值 *** 作 5.3.1 新增一列
我们在原有的三学科基础上增加一门 C++ 的成绩
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(60, 101, size = (5, 3)), columns = ['Python', 'English', 'Math']) display(df) # 添加一个新学科:C++【增加一列】 df['C++'] = np.random.randint(60, 101, size = 5) display(df)5.3.2 整列的变化
我们让 Python 这门课的所有学生的分数都增加 10 分,再将 Math,C++的分数都增加10分
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(60, 101, size = (5, 3)), columns = ['Python', 'English', 'Math']) df['C++'] = np.random.randint(60, 101, size = 5) display(df) # 将 Python 这列的分数都增加 10 分 df['Python'] += 10 display(df) # 将 Math,C++的分数都增加10分 df[['Math', 'C++']] += 10 display(df)5.3.3 列上元素的变化
我们将 Math 中索引是 2 的人的分数改为 100,再将 Math 中索引是 2,3 的人的分数改为 99
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(60, 101, size = (5, 3)), columns = ['Python', 'English', 'Math']) df['C++'] = np.random.randint(60, 101, size = 5) display(df) # 将 Math 中索引是 2 的人的分数改为 100 df['Math'][2] = 100 display(df) # 将 Math 中索引是 2,3 的人的分数改为 99 df['Math'][[2, 3]] = 99 display(df)5.3.4 批量 *** 作多个数据
将 Math,C++ 中索引是 2,3 的人的分数改为 80
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(60, 101, size = (5, 3)), columns = ['Python', 'English', 'Math']) df['C++'] = np.random.randint(60, 101, size = 5) display(df) # 将 Math,C++ 中索引是 2,3 的人的分数改为 80 # df[['Math', 'C++']][[2, 3]] = 80 这种 *** 作是错误的 df.loc[[2, 3], ['Math', 'C++']] = 80 display(df)
在条件的情况下修改多个值,必须使用 loc:
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(60, 101, size = (5, 3)), columns = ['Python', 'English', 'Math']) df['C++'] = np.random.randint(60, 101, size = 5) display(df) # 将 C++的分数大于 80 的人的分数统一减去 20分 cnt = df['C++'] > 80 # 使用 loc 修改数据 df.loc[cnt] -= 20 display(df)6.训练场 6.1 创建1000条语、数、外、Python的考试成绩Dataframe,范围是0~150包含150,分别将数据保存到csv文件以及Excel文件,保存时不保存行索引。
import numpy as np import pandas as pd df = pd.Dataframe(np.random.randint(0, 151, size = (1000, 4)), columns = ['语', '数', '英', 'Python']) df.to_csv('./score.csv', index = False) df.to_excel('./score.xlsx', index = False)6.2 创建使用字典创建Dataframe,行索引是a~z,列索引是:身高(160-185)、体重(50-90)、学历(无、本科、硕士、博士)。身高、体重数据使用NumPy随机数生成,学历数据先创建数组 edu =np.array([‘无’,‘本科’,‘硕士’,‘博士’]),然后使用花式索引从四个数据中选择26个数据。
import numpy as np import pandas as pd edu = np.array(['无', '本科', '硕士', '博士']) # 花式索引取数据 index = np.random.randint(0, 4, size = 26) edu = edu[index] data = pd.Dataframe({'身高':np.random.randint(160, 186, size = 26), '体重':np.random.randint(50, 91, size = 26), '学历':edu}, index = list('qwertyuiopasdfghjklzxcvbnm')) # 这个单纯是为了图省事儿,手指按住键盘滑动产生 # 我们要求行索引是 a~ z,故我们来排个序 data = data.sort_index(ascending = True) ''' 或者要生成 a ~ z 也可以采取: index = np.arange(97, 123) index = [chr(i) for i in index] ''' display(data)6.3 使用题目二中的数据,进行数据筛选。 6.3.1 筛选索引大于 ‘t’ 的所有数据
# 获取索引,进行逻辑运算 # data.index 可以获取 data 的行索引 cnt = data.index > 't' data[cnt]6.3.2 筛选学历是博士,身高大于170或者体重小于80的学生
cnt1 = data['学历'] == '博士' cnt2 = data['身高'] > 170 cnt3 = data['体重'] < 80 cnt = cnt1 & (cnt2 | cnt3) data[cnt]6.4 使用题目二中数据,开始学生们开始减肥 6.4.1 本科生减肥,减掉的体重统一是10
cnt = data['学历'] == '本科' display(data[cnt]) data.loc[cnt,'体重'] -= 10 display(data[cnt])6.4.2 博士生减肥,减掉体重范围是5~10
cnt = data['学历'] == '博士' display(data[cnt]) ''' data[cnt].shape 运行结果为(8, 3) data[cnt].shape[0] 运行结果为 8 ''' data.loc[cnt, '体重'] -= np.random.randint(5, 11, size = data[cnt].shape[0]) # 相当于 size = 8 display(data[cnt])
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)