pandas 入门

pandas 入门,第1张

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])

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存