栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 云计算 > 云平台

(数据分析三板斧)第二斧Pandas-第一节:Pandas了解及其两大核心数据结构(DataFrame和Series)

云平台 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(数据分析三板斧)第二斧Pandas-第一节:Pandas了解及其两大核心数据结构(DataFrame和Series)

文章目录
  • 一:Pandas了解
    • (1)什么是Pandas
    • (2)Pandas优势
    • (3)Pandas安装
    • (4)Pandas核心数据结构
  • 二:DataFrame类型
    • (1)DataFrame结构
    • (2)DataFrame构造方法
    • (3)DataFrame索引
      • A:基本设置方法
      • B:其他操作(先看第 (4)再看这个)
        • ①:修改行列索引值
        • ②:重设索引
        • ③:使用字典设置索引
        • ④:把某列设置为新的索引
    • (4)DateFrame常用属性和方法
      • A:属性
      • B:方法
  • 三:Series类型
    • (1)Series结构与创建

一:Pandas了解 (1)什么是Pandas

Pandas是2008年WesMcKinney开发出的库,是一个专门用于数据挖掘的开源Python库,它以Numpy为基础,借力Numpy模块在计算方面性能高的优势,又基于Matplotlib,可以简便的画图,而且还拥有自己独特的数据结构

  • Pandas=Panel+data+analysis
(2)Pandas优势

在学习完Numpy和Matplotlib后还要学习Pandas的原因在于:Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具,也提供了大量使我们能够快速处理数据的函数和方法。具体来说:

  • Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。

  • Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。

  • Pandas 广泛应用在学术、金融、统计学等各个数据分析领域

(3)Pandas安装
  • 自行查阅,安装非常简单

安装好之后,可以通过下面的语句导入Pandas库以及查看其是否能够正常运行

import pandas as pd


mydataset = {
  'sites': ["Google", "Runoob", "Wiki"],
  'number': [1, 2, 3]
}

myvar = pd.DataFrame(mydataset)

print(myvar)

(4)Pandas核心数据结构

在Pandas中有两类数据结构

  • Series:是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成;它可以保存不同种类的数据类型
  • DataFrame:是一个表格型的数据结构(Excel、SQL等),它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
二:DataFrame类型

Numpy注重运算,所以对于数据意义的表达没有那么清楚,比如下面用Numpy生成了一个符号正态分布的10支股票5天的涨幅情况

  • 这样的数据表现形式让人有点难受,因为完全不知道它在表达什么
stock_change = np.random.normal(0, 1, (10, 5))
print(stock_change)


[[ 0.22129238  1.72192263  0.49808165 -0.70501369 -0.57315298]
 [-0.05685967 -1.59493883  0.20770355  2.03934052 -0.91647225]
 [-0.64659703 -1.7586049  -0.53091496 -0.95453855  0.84446516]
 [ 0.02877987  1.53110344 -0.90623823  1.41938924 -1.24248129]
 [-0.36990152 -0.17153907  0.24179436  0.82450977  1.1865927 ]
 [-0.14524005 -0.57297533 -0.08680693  0.07105316 -0.12050658]
 [ 0.50399736  1.56385492 -0.38175291  0.52144963  0.51322901]
 [ 0.71534998 -0.61644881  0.15437358  0.00324533 -0.830954  ]
 [-0.65036464 -1.71639338 -1.18670887  0.34092581 -0.8870423 ]
 [-0.89061683 -0.93671895 -0.19911303  0.49350255  2.02240886]]

因此,我们的DataFrame就是为了让数据更有意义的显示。这里可以直接调用pd.DataFrame(),然后将numpy数组传入进去

stock_change = np.random.normal(0, 1, (10, 5))
a = pd.DataFrame(stock_change)
print(a)

你会发现,现在显示形式比之前就舒服多了

(1)DataFrame结构

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)

因此,上面的那个例子中行列索引表达的意思为

(2)DataFrame构造方法

DataFrame 构造格式下:

pandas.DataFrame( data, index, columns, dtype, copy)
  • data:一组数据(ndarray、series, map, lists, dict 等类型)。

  • index:索引值,或者可以称为行标签。

  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。

  • dtype:数据类型。

  • copy:拷贝数据,默认为 False

举例

a = pd.DataFrame(np.random.randn(4, 5))  # numpy二维随机数组
print(a)


从以上输出结果可以知道, DataFrame 数据类型一个表格,包含 rows(行) 和 columns(列)

(3)DataFrame索引 A:基本设置方法

上例中默认显示的索引并不是很合适,没有起到见名知意的作用。我的目的是行索引显示股票支数,列索引显示天数,这里先用列表生成式生成行索引

stock_index = ["股票{}".format(i) for i in range(10)]  # 行索引 

然后在刚才的pd.DataFrame()中传入index=stock_index,即行索引

stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]  # 行索引
a = pd.DataFrame(stock_change, index=stock_index)
print(a)

对于列索引,我们直接调用Pandas中现成的函数

  • 关于date_range()更为详细的用法可以参照这篇文章点击跳转
date_index = pd.date_range(start='20220510', periods=5, freq='B') #列索引

然后在刚才的pd.DataFrame()中传入columns=date_index,即列索引

stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]  # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B')  # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a)

B:其他操作(先看第 (4)再看这个) ①:修改行列索引值
  • 特别注意:在Pandas中,索引是不支持单独修改的,也即,类似于DataFrame.index[2] = '×××'这样的操作是不支持的,只能整体修改

修改时,只需对其index属性重新赋值即可

stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]  # 行索引(旧)
stock_index_new = ["第{}支股票".format(j) for j in range(10)]  # 行索引(新)
date_index = pd.date_range(start='20220510', periods=5, freq='B')  # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
a.index = stock_index_new  # 更换索引
print(a)

②:重设索引

使用DataFrame.reset_index(drop=False)可以重设索引

  • 如果drop=False:则不会删除原来索引
  • 如果drop=True:则会删除原来的索引
stock_change = np.random.normal(0, 1, (3, 5))
stock_index = ["股票{}".format(i) for i in range(3)]  # 行索引(旧)
date_index = pd.date_range(start='20220510', periods=5, freq='B')  # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a)  # 原始情况
print("-"*20)
b = a.reset_index()  # 重设索引,且不删除原来索引
print(b)
print("-"*20)
c = a.reset_index(drop=True)  # 重设索引,且删除原来索引
print(c)

③:使用字典设置索引

在设置索引时,还可以传入字典,如下

a = pd.DataFrame(
    {
        "month": [1, 4, 7, 10],
        "year": [2012, 2014, 2013, 2020],
        "sale": [55, 40, 84, 31]
    }
)
print(a)

④:把某列设置为新的索引

在Pandas中使用set_index(keys, drop=True)可以把某个列直接设置为索引

  • keys:表示列索引名或者列索引名称的列表
  • drop:是一个布尔类型,默认为True,表示当该列做新的索引时会删除原来的列
a = pd.DataFrame(
    {
        "month": [1, 4, 7, 10],
        "year": [2012, 2014, 2013, 2020],
        "sale": [55, 40, 84, 31]
    }
)
print("原始")
print(a)
print("-"*20)
print('''把"month"设置为新的索引,并删除原来的列''')
b = a.set_index('month')
print(b)
print("-"*20)
print('''把"month"和"year"设置为新的索引,并删除原来的列''')
c = a.set_index(['month', 'year'])
print(c)

结果为

原始
   month  year  sale
0      1  2012    55
1      4  2014    40
2      7  2013    84
3     10  2020    31
--------------------
把"month"设置为新的索引,并删除原来的列
       year  sale
month            
1      2012    55
4      2014    40
7      2013    84
10     2020    31
--------------------
把"month"和"year"设置为新的索引,并删除原来的列
            sale
month year      
1     2012    55
4     2014    40
7     2013    84
10    2020    31

Process finished with exit code 0


如果某个DataFrame设置了多个索引,那么它的索引就叫做MulitIndex。例如上面的例子中我们为其设定了month和year两个索引,然后查看其index属性

a = pd.DataFrame(
    {
        "month": [1, 4, 7, 10],
        "year": [2012, 2014, 2013, 2020],
        "sale": [55, 40, 84, 31]
    }
)

print('''把"month"和"year"设置为新的索引,并删除原来的列''')
b = a.set_index(['month', 'year'])
print(b)
print("-"*20)
print(b.index)

实际上,拥有MulitIndex的DataFrame是可以存储三维数据

MulitIndex内含属性如下

  • names:levels的名称
  • levels:每个levels的元组值
print(b.index.names)
print(b.index.nlevels)

Pandas中有用于处理三维数组的结构Pandas,其对应的索引就是MulitIndex,但是Pandas目前已经把这种结构给移除了,而是采用带MulitIndex的DataFrame去处理三维数组

(4)DateFrame常用属性和方法 A:属性

DateFrame说穿了其实就是Numpy二维数组加了行列索引,所以Numpy数组具有的属性,DateFrame基本也有,常用属性有

stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]  # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B')  # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a.shape)  # 形状
print("-"*20)
print(a.index)  # 返回DateFrame行索引列表
print("-"*20)
print(a.columns)  # 返回DateFrame列索引列表
print("-"*20)
print(type(a.values))  # 返回原生Numpy数组
print("-"*20)

B:方法

如果我们要频繁查看表的头部和尾部信息,可以使用head()和tail()

stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]  # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B')  # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a.head(3))  # 查看前三只股表信息
print("-"*20)
print(a.tail(2))  # 查看后两只股票信息


如果要获取DataFrame中某个股票的不同时间数据,可以使用 DataFrame.iloc();其实这本质就是Numpy中的切片操作

stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]  # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B')  # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)

print(a)
print("-"*20)
print(a.iloc[1:3, 1:3])

#########################结果##################################################
     2022-05-10  2022-05-11  2022-05-12  2022-05-13  2022-05-16
股票0   -0.030529    0.491926    0.599494    0.292252    0.436244
股票1   -1.213430    0.278960   -0.442035    0.941825    0.036534
股票2   -0.921940    0.236212   -0.649530    0.621479    0.094708
股票3    0.416826   -0.643720   -0.471491    0.240899    0.704580
股票4   -0.156581   -1.027308    0.837797   -0.360443    0.187924
股票5    1.546736   -0.420407    0.876887    1.499043    0.026667
股票6   -0.026673   -0.061860    1.136667   -0.748732   -1.584693
股票7   -1.183476    0.444513   -2.143341   -0.456710    1.423592
股票8    0.264159   -0.659765    1.366594   -0.981925    0.104557
股票9   -0.073674    0.211402    0.016598   -1.600371    1.405910
--------------------
     2022-05-11  2022-05-12
股票1    0.278960   -0.442035
股票2    0.236212   -0.649530
三:Series类型 (1)Series结构与创建

Series 类似表格中的一个列(column),是一种带索引(只有行索引)的一维数组,或者说DataFrame是Series的容器,格式如下

pandas.Series( data, index, dtype, name, copy)
  • data:一组数据(ndarray 类型)

  • index:数据索引标签,如果不指定,默认从 0 开始

  • dtype:数据类型,默认会自己判断

  • name:设置名称

  • copy:拷贝数据,默认为 False

例如

a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
print(a['C'])


注意:可以使用pandas.index.name来为索引列起一个名字

a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
a.index.name = '索引'
print(a)

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

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

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