美文网首页
Pandas基础使用

Pandas基础使用

作者: 歪理斜说 | 来源:发表于2020-07-05 21:22 被阅读0次

Pandas 常用的数据结构有两种:Series和DataFrame。其中Series是一个带有名称和索引的一维数组,而DataFrame则是用来表示多维的数组结构。

使用pandas需要频繁用到读取和写入Excel,但默认的pandas还不能读写Excel文件,需要安装xlrd(读)和xlwt(写)库才能支持Excel的读写。
为Python添加读取/写入Excel功能的命令如下:

    pip install xlrd
    pip install xlwt

一、Series数据结构与索引

# 导入pandas
import pandas as pd

1、Series数据结构介绍

假设我们有一系列股票的开盘价信息,那么如果在没有学习Pandas之前,我们可以用字典来表示:

stock_price_dict = {"300773":3.5, "600751":7.2, 
                "300405":12.6, "002937":4.7, "601615":8.2}

现在我们可以使用 pandas 轻松构建 Series 数据集:

stock_seri = pd.Series([3.5, 7.2, 12.6, 4.7, 8.2], 
                       index=["300773", "600751", "300405", "002937", "601615"], 
                       name="Stock")

对于上面的Series数据集,有3个比较重要的属性:indexvaluename。index也就是索引,在Pandas里,索引不仅仅是位置序号,你也可以根据数据集特征进行自定义,比如这里的index就是股票代码。value是股票的开盘价格。name则是数据集的名称。

# 查阅索引
stock_seri.index
Out: Index(['300773', '600751', '300405', '002937', '601615'], dtype='object')

# 查阅数据值,注意,该方法返回array格式
stock_seri.value
Out: array([ 3.5,  7.2, 12.6,  4.7,  8.2])

# 查阅数据集的名称
stock_seri.name
Out: 'Stock'

2、Series的常用操作

(1)Series的索引更为方便,你可以直接传入单个索引值进行检索,或者以列表的格式传入一组值。
stock_seri["300773"]
Out: 3.5

# 传入列表进行索引,返回格式仍是pandas.core.series.Series
stock_seri[["002937", "300773", "601615"]]
Out: 
    002937    4.7
    300773    3.5
    601615    8.2
    Name: Stock, dtype: float64

# 利用布尔进行索引
stock_seri[[True, False, True, False, True]]
Out: 
    300773     3.5
    300405    12.6
    601615     8.2
    Name: Stock, dtype: float64

# 切片索引。要特别注意的是,对于index切片进行索引,pandas是左闭右闭的区间,这里和Python有明显不同
stock_seri["300773":"300405"]
Out:
    300773     3.5
    600751     7.2
    300405    12.6
    Name: Stock, dtype: float64
(2)Series的运算

Numpy常用的运算,在Series里也是适用的。

# 筛选出开盘价在8以上的个股
stock_seri[stock_seri>8]
Out: 300405    12.6
    601615     8.2
    Name: Stock, dtype: float64
# 计算个股的双倍价格
stock_seri * 2
Out: 
    300773     7.0
    600751    14.4
    300405    25.2
    002937     9.4
    601615    16.4
    Name: Stock, dtype: float64
# 计算股票池的均价
import numpy as np
np.average(stock_seri)
Out: 7.239999999999999
(3)查看Series数据集中是否有空值
# 查看空值,空值的位置返回True
stock_seri.isnull()
Out: 
    300773    False
    600751    False
    300405    False
    002937    False
    601615    False
    Name: Stock, dtype: bool
# 查看空值,空值的位置返回False
stock_seri.notnull()
Out: 
    300773    True
    600751    True
    300405    True
    002937    True
    601615    True
    Name: Stock, dtype: bool
(4)Series的索引、更新数据也可以通过直接赋值的方式显式修改
# 修改index
stock_seri.index = ["拉卡拉", "海航科技", "科隆股份", "兴瑞科技", "明阳智能"]
stock_seri
Out: 
    拉卡拉      3.5
    海航科技     7.2
    科隆股份    12.6
    兴瑞科技     4.7
    明阳智能     8.2
    Name: Stock, dtype: float64
# 更新兴瑞科技的股票价格
stock_seri["兴瑞科技"] = 6.8
stock_seri
Out: 
    拉卡拉      3.5
    海航科技     7.2
    科隆股份    12.6
    兴瑞科技     6.8
    明阳智能     8.2
    Name: Stock, dtype: float64
(5)如果数据被存放在字典中,也可以通过字典来创建Series,这里利用本节开篇的字典来创建一个股票池。
# 通过字典创造Series没有name属性
pd.Series(stock_price_dict)
Out:
    300773     3.5
    600751     7.2
    300405    12.6
    002937     4.7
    601615     8.2
    dtype: float64

二、DataFrame数据结构与索引

DataFrame是Series在水平方向的扩展,是一个多列表格型的数据结构。其创建过程和Series相比非常类似。

# 传入array类型,生成一个DataFrame数据结构
import numpy as np
frame0 = pd.DataFrame(np.arange(6).reshape(2,3), 
                      index=[2000, 2001], columns=["A", "B", "C"])
frame0
Out: 
        A   B   C
2000    0   1   2
2001    3   4   5

或者也可以利用字典格式,生成DataFrame数据结构。

# 利用字典生成DataFrame
data = {"A":[0, 3], "B":[1, 4], "C":[2, 5]}
pd.DataFrame(data, index=[2000, 2001])
Out: 
        A   B   C
2000    0   1   2
2001    3   4   5

从上面的例子看,相比较Series,DataFrame多了列索引,也就意味着对DataFrame的索引更加灵活。

# 用中括号传入对应的列名,可以进行列索引。索引的结果为Series格式
frame0["A"]
Out:
    2000    0
    2001    3
    Name: A, dtype: int32

# 同时对多列索引,需要以列表的形式传入序列
frame0[["A", "B"]]
Out: 
            A   B
    2000    0   1
    2001    3   4

DataFrame索引的索引则稍有区别,也是学习的重点之一。DataFrame的索引包括行索引与列索引,但是因为DataFrame的行和列均有实体的标签名(相较于Numpy,其只有位置索引),所以我们可以通过两种方式进行索引,分别是标签索引和位置索引。

1、loc 标签索引

Pandas自带的loc方法,通过具体的标签名字来索引行或者列。

# 选择索引为2000的行
frame0.loc[2000]
Out:
    A    0
    B    1
    C    2
    Name: 2000, dtype: int32

# 选择“A”列
frame0.loc[:,"A"]
Out:
    2000    0
    2001    3
    Name: A, dtype: int32

# 选择索引为2001,BC列的元素
# 在pandas中,利用标签名进行索引,遵从左闭右闭的区间,这点和位置索引不一样
frame0.loc[2001, "B":"C"]
Out:
    B    4
    C    5
    Name: 2001, dtype: int32

在loc函数中,可以传入一组后者两组标签名参数,第一组参数表示index,第二组则用来表征columns。

2、iloc函数

Pandas自带的iloc方法,通过位置来索引行或者列,索引规则和Numpy的切片索引非常相似。

# 通过位置,选择索引为2000的行
frame0.iloc[0]
Out:
    A    0
    B    1
    C    2
    Name: 2000, dtype: int32

# 通过位置,选择“A”列
frame0.iloc[:,0]
Out:
    2000    0
    2001    3
    Name: A, dtype: int32

# 通过位置,选择索引为2001,BC列的元素
# 这里要区分开来,涉及到位置切片,仍然为左闭右开的规则
frame0.iloc[1, 1:]
Out:
    B    4
    C    5
    Name: 2001, dtype: int32

在iloc函数中,可以传入一组后者两组位置参数,第一组参数表示index,第二组则用来表征columns。

3、索引对象初窥

(1)DataFrame的行

在上面的案例中,我们在创建数据结构的过程中,都显式地定义了index的值(也就是行索引),这里我们就来探究一下index的基本特性。

# index对象可以像列表一样被灵活切片
frame0.index[:1]
Out: Int64Index([2000], dtype='int64')

# 但是index对象是不可以被修改的。
# 如果用户希望更改数据集的索引,要么显式的重新定义index(就像上文,显式地更改Series的index)。
# 要么用reindex的方式,为数据集构造一个新的index对象
frame0.reindex([2000, 2001, 2002])
Out:
        A   B   C
2000    0.0 1.0 2.0
2001    3.0 4.0 5.0
2002    NaN NaN NaN
# 可以看到,reindex的方式,会继承原先的索引,如果有新增的索引项,那么会自动填充空值。
# 也可以增加fill_value属性,自动填充其他值。
frame0.reindex([2000, 2001, 2002], fill_value=20)
Out: 
        A   B   C
2000    0   1   2
2001    3   4   5
2002    20  20  20

(2)DataFrame的列

那列索引呢?

# 列索引的基本格式和行索引一直,也是Pandas自带的Index格式
frame0.columns
Out: Index(['A', 'B', 'C'], dtype='object')

如果要修改列名,有2种方法。一种是利用rename函数,另一种则是显式地重新指定。

# 方法一:利用rename函数
frame0.rename(columns = {"A": "col_01", "B": "col_02", "C": "col_03"})
Out:
        col_01  col_02  col_03
    2000    0   1   2
    2001    3   4   5

# 方法二:重新指定
frame0.columns = ["col_01", "col_02", "col_03"]
frame0
Out:
        col_01  col_02  col_03
    2000    0   1   2
    2001    3   4   5

总结

有了Numpy的基础,入门Pandas还是很友好的。Pandas最重要的两种数据结构为SeriesDataFrame,其中Series可以理解为一维的数据表格。

无论是Series还是DataFrame,和array相比,最大的区别是多了标签名,包括行标签名和列标签名。因此在对Series和DataFrame索引的时候,可以灵活地选择位置索引和标签名索引,大家可以根据习惯自由选择,精通一种、熟悉另一种即可。

相关文章

网友评论

      本文标题:Pandas基础使用

      本文链接:https://www.haomeiwen.com/subject/ctkbqktx.html