栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

pandas 入门

pandas 入门

目录

前言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,运行如下代码,没有报错证明安装成功:

2.数据结构 2.1 一维结构(Series)
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)

2.2 二维结构(Dataframe)
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])

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/712584.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号