Pandas安装与基础应用

1、学习目标

  • 知道Pandas的作用

  • 能够搭建使用Pandas的开发环境

Pandas介绍

Python在数据处理上独步天下:代码灵活、开发快速;尤其是Python的Pandas包,无论是在数据分析领域、还是大数据开发场景中都具有显著的优势:

  • Pandas是Python的一个第三方包,也是商业和工程领域最流行的结构化数据工具集,用于数据清洗、处理以及分析

  • Pandas在数据处理上具有独特的优势:

    • 底层是基于Numpy构建的,所以运行速度特别的快

    • 有专门的处理缺失数据的API

    • 强大而灵活的分组、聚合、转换功能

适用场景:

  • 数据量大到Excel严重卡顿,且又都是单机数据的时候,我们使用Pandas

    • Pandas用于处理单机数据(小数据集(相对于大数据来说))

  • 在大数据ETL数据仓库中,对数据进行清洗及处理的环节使用Pandas

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pandas

注意:Anaconda默认已经安装了Pandas以及Numpy等内容

Pandas初体验

  • 1- 将资料中提供的数据集导入到data目录中

  • 2- 创建python脚本, 导入pandas库

import pandas as pd
  • 3- 基于pandas加载数据

df = pd.read_csv('./1960-2019全球GDP数据.csv', encoding='gbk')  

# 设置显示的最大行数和列数为None

pd.set_option('display.max_rows', None) pd.set_option('display.max_columns', None)

# 恢复显示的最大行数到默认值

pd.reset_option('display.max_rows') # 恢复显示的最大列数到默认值 pd.reset_option('display.max_columns')

# 恢复所有选项到默认值 pd.reset_option('all')

  • 4- 基于pandas完成相关查询:

# 查询中国的GDP
china_gdp = df[df.country=='中国'] # df.country 选中名为country的列
china_gdp.head(10) # 显示前10条数据

运行结果:

5- 查询中国GDP

china_gdp = df[df.country=='中国'] # df.country 选中名为country的列
china_gdp.head(10) # 显示前10条数据

6- 将year年份设置为索引

china_gdp = china_gdp.set_index('year')
china_gdp.head() # 默认显示前5条

7- 画出GDP逐年变化的曲线图

china_gdp.GDP.plot()

使用同样的方法画出日本的GDP变化曲线,和中国的GDP变化曲线进行对比

jp_gdp = df[df.country=='日本'].set_index('year') # 按条件选取数据后,重设索引
jp_gdp.GDP.plot() 
china_gdp.GDP.plot()

分别查询中国、美国、日本三国的GDP数据,并绘制GDP变化曲线、进行对比

china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
jp_gdp.GDP.plot()
china_gdp.GDP.plot()
us_gdp.GDP.plot()

设置图例:

# 按条件选取数据
china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
# 出图并添加图例
jp_gdp.GDP.plot(legend=True)
china_gdp.GDP.plot(legend=True)
us_gdp.GDP.plot(legend=True)

修改列名使图例显示为各国名称

# 按条件选取数据
china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
# 对指定的列修改列名
jp_gdp.rename(columns={'GDP':'japan'}, inplace=True)
china_gdp.rename(columns={'GDP':'china'}, inplace=True)
us_gdp.rename(columns={'GDP':'usa'}, inplace=True)
# 画图
jp_gdp.japan.plot(legend=True)
china_gdp.china.plot(legend=True)
us_gdp.usa.plot(legend=True)

8- 解决中文不能在图表中正常显示的问题

将列名改为中文,使图例显示为各国名称

# 按条件选取数据
china_gdp = df[df.country=='中国'].set_index('year')
us_gdp = df[df.country=='美国'].set_index('year')
jp_gdp = df[df.country=='日本'].set_index('year')
# 对指定的列修改列名
jp_gdp.rename(columns={'GDP':'日本'}, inplace=True)
china_gdp.rename(columns={'GDP':'中国'}, inplace=True)
us_gdp.rename(columns={'GDP':'美国'}, inplace=True)
# 画图
jp_gdp['日本'].plot(legend=True)
china_gdp['中国'].plot(legend=True)
us_gdp['美国'].plot(legend=True)

# 解决中文显示问题,下面的代码只需运行一次即可
import matplotlib as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

运行结果:

小结

Python Pandas的作用:(清洗、处理、分析数据)

Pandas环境搭建:

  • 安装Anaconda,默认自带Python以及其他相关三方包

  • 使用默认的base虚拟环境启动JupyterNotebook

二、Pandas数据结构与数据类型

学习目标

  • 知道什么是DataFrame对象、什么是Seires对象

  • 对Series和DataFrame的常用API有印象、能找到、能看懂

  • 了解Pandas中常用数据类型

  • 知道Series以及DataFrame的运算规则

  • 知道numpy.where()函数的用法

Pandas数据结构和数据类型

上图为上一节中读取并展示出来的数据,以此为例我们来讲解Pandas的核心概念,以及这些概念的层级关系:

  • DataFrame

    • Series

      • 索引列

        • 索引名、索引值

        • 索引下标、行号

      • 数据列

        • 列名

        • 列值,具体的数据

其中最核心的就是Pandas中的两个数据结构:DataFrame和Series

Series对象

Series也是Pandas中的最基本的数据结构对象,下文中简称s对象;是DataFrame的列对象,series本身也具有索引。

Series是一种类似于一维数组的对象,由下面两个部分组成:

  • values:一组数据(numpy.ndarray类型)

  • index:相关的数据索引标签;如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。

创建Series对象

  • 1- 导入pandas

import pandas as pd
  • 2- 通过list列表来创建

# 使用默认自增索引
s2 = pd.Series([1, 2, 3])
print(s2)
# 自定义索引
s3 = pd.Series([1, 2, 3], index=['A', 'B', 'C'])
s3


结果为:
0    1
1    2
2    3
dtype: int64
A    1
B    2
C    3
dtype: int64

3- 使用字典或元组创建series对象

#使用元组
tst = (1,2,3,4,5,6)
pd.Series(tst)

#使用字典:
dst = {'A':1,'B':2,'C':3,'D':4,'E':5,'F':6}
pd.Series(dst)

4- 使用numpy创建series对象

pd.Series(np.arange(10))
# 运行结果
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64

Series对象属性

构造一个series对象

s4 = pd.Series([i for i in range(6)], index=[i for i in 'ABCDEF'])
s4
# 返回结果如下
A    0
B    1
C    2
D    3
E    4
F    5
dtype: int64

1- series对象常用属性

s4.index

2- values

s4.values

3- 也可以通过索引来获取数据

s4['A']

DataFrame

创建DataFrame对象

DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引

  • 行索引,表明不同行,横向索引,叫index,0轴,axis=0

  • 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

DataFrame的创建有很多种方式

读取文件数据返回df:在之前的学习中我们使用了pd.read_csv('csv格式数据文件路径')的方式获取了df对象

使用字典、列表、元组创建df:接下来就展示如何使用字典、列表+元组、numpy创建df对象


  • 1- 使用字典加列表创建df,使默认自增索引

df1_data = {
    '日期': ['2021-08-21', '2021-08-22', '2021-08-23'],
    '温度': [25, 26, 50],
    '湿度': [81, 50, 56] 
}
df1 = pd.DataFrame(data=df1_data)
df1

# 返回结果如下
        日期    温度    湿度
0    2021-08-21    25    81
1    2021-08-22    26    50
2    2021-08-23    50    56

2- 使用列表加元组创建df,并自定义索引

df2_data = [
    ('2021-08-21', 25, 81),
    ('2021-08-22', 26, 50),
    ('2021-08-23', 27, 56)
]

df2 = pd.DataFrame(
    data=df2_data, 
    columns=['日期', '温度', '湿度'],
    index = ['row_1','row_2','row_3'] # 手动指定索引
)
df2

# 返回结果如下
            日期    温度    湿度
row_1    2021-08-21    25    81
row_2    2021-08-22    26    50
row_3    2021-08-23    27    56
  • 3- 使用numpy创建df

通过已有数据创建

pd.DataFrame(np.random.randn(2,3))  # 2行3列

创建学生成绩表

# 生成10名同学,5门功课的数据
score = np.random.randint(40, 100, (10, 5))

# 结果
array([[92, 55, 78, 50, 50],
       [71, 76, 50, 48, 96],
       [45, 84, 78, 51, 68],
       [81, 91, 56, 54, 76],
       [86, 66, 77, 67, 95],
       [46, 86, 56, 61, 99],
       [46, 95, 44, 46, 56],
       [80, 50, 45, 65, 57],
       [41, 93, 90, 41, 97],
       [65, 83, 57, 57, 40]])

但是这样的数据形式很难看到存储的是什么的样的数据,可读性比较差!

问题:如何让数据更有意义的显示?

# 使用Pandas中的数据结构
score_df = pd.DataFrame(score)

给分数数据增加行列索引,显示效果更佳

效果:

增加行、列索引

# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]

# 构造列索引序列
stu = ['同学' + str(i) for i in range(score_df.shape[0])]

# 添加行索引
data = pd.DataFrame(score, columns=subjects, index=stu)

DataFrame对象属性

属性

  • 1- shape属性

data.shape

# 结果
(10, 5)
  • 2- index属性

DataFrame的行索引列表

data.index

# 结果
Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object')

3- columns

data.columns

# 结果
Index(['语文', '数学', '英语', '政治', '体育'], dtype='object')
  • 4- values

直接获取其中array的值

data.values

array([[92, 55, 78, 50, 50],
       [71, 76, 50, 48, 96],
       [45, 84, 78, 51, 68],
       [81, 91, 56, 54, 76],
       [86, 66, 77, 67, 95],
       [46, 86, 56, 61, 99],
       [46, 95, 44, 46, 56],
       [80, 50, 45, 65, 57],
       [41, 93, 90, 41, 97],
       [65, 83, 57, 57, 40]])
  • 5- T

转置

data.T

结果

DataFrame对象方法

1- head(n)

显示前n行内容

data.head(5)

2- tail(n)

显示后n行内容

如果不补充参数,默认5行。填入参数n则显示后n行

data.tail(5)

DatatFrame索引的设置

需求:

  • 1- 修改行列索引值

stu = ["学生_" + str(i) for i in range(score_df.shape[0])]
​
# 必须整体全部修改
data.index = stu

注意:以下修改方式是错误的

# 错误修改方式
data.index[3] = '学生_3'
  • 2- 重设索引

    • reset_index(drop=False)

      • 设置新的下标索引

      • drop:默认为False,不删除原来索引,如果为True,删除原来的索引值

# 重置索引,drop=False
data.reset_index()

  • 3- 以某列值设置为新的索引

    • set_index(keys, drop=True)

      • keys : 列索引名成或者列索引名称的列表

      • drop : boolean, default True.当做新的索引,删除原来的列

设置新索引案例

第一步:创建

df = pd.DataFrame({'month': [1, 4, 7, 10],
                    'year': [2012, 2014, 2013, 2014],
                    'sale':[55, 40, 84, 31]})
​
   month  sale  year
0  1      55    2012
1  4      40    2014
2  7      84    2013
3  10     31    2014

第二步:以月份设置新的索引

df.set_index('month')
       sale  year
month
1      55    2012
4      40    2014
7      84    2013
10     31    2014

第三步:设置多个索引,以年和月份

df = df.set_index(['year', 'month'])
df
            sale
year  month
2012  1     55
2014  4     40
2013  7     84
2014  10    31

Pandas的数据类型

df或s对象中具体每一个值的数据类型有很多,如下表所示

Pandas数据类型说明对应的Python类型
Object字符串类型string
int整数类型int
float浮点数类型float
datetime日期时间类型datetime包中的datetime类型
timedelta时间差类型datetime包中的timedelta类型
category分类类型无原生类型,可以自定义
bool布尔类型bool(True,False)
nan空值类型None
  • 可以通过下列API查看s对象或df对象中数据的类型

s1.dtypes
df1.dtypes
df1.info() # s对象没有info()方法
  • 几个特殊类型演示

    • datetime类型

    import pandas as pd
    ​
    # 创建一个datetime类型的Series
    dates = pd.to_datetime(['2024-09-01', '2024-09-02', '2024-09-03'])
    print(dates)
    • timedelta类型

    import pandas as pd
    ​
    # 计算两个日期之间的差值
    start_date = pd.to_datetime('2024-09-01')
    end_date = pd.to_datetime('2024-09-05')
    delta = end_date - start_date
    print(delta)
    • category类型

    类型用于表示分类数据,通常用于有限集合中的数据类型,例如性别、颜色、产品类型等。这种类型的优点在于占用更少的内存,并且对分类数据的操作更快。

    import pandas as pd
    ​
    # 创建一个category类型的Series
    categories = pd.Series(['apple', 'banana', 'apple', 'orange'], dtype='category')
    print(categories)

小结

  • series【知道】

    • 创建

      • pd.Series([], index=[])

      • pd.Series({})

    • 属性

      • 对象.index

      • 对象.values

  • DataFrame【掌握】

    • 创建

      • pd.DataFrame(data=None, index=None, columns=None)

    • 属性

      • shape -- 形状

      • index -- 行索引

      • columns -- 列索引

      • values -- 查看值

      • T -- 转置

      • head() -- 查看头部内容

      • tail() -- 查看尾部内容

    • DataFrame索引

      • 修改的时候,需要进行全局修改

      • 对象.reset_index()

      • 对象.set_index(keys)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值