Pandas介绍

简介: Pandas介绍

Pandas介绍

为什么要学习pandas?

那么问题来了

numpy 已经能够帮助我们处理数据,能够结合 matplotlib 解决我们数据分析的问题,那么 pandas 学习的目的在什么地方呢?

numpy 能够帮我们处理处理数值型数据,但是这还不够, 很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等

比如:我们通过爬虫获取到了存储在数据库中的数据

所以,pandas 出现了。

什么是Pandas?

Pandas的名称来自于面板数据(panel data)

Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

  • 一个强大的分析和操作大型结构化数据集所需的工具集
  • 基础是NumPy,提供了高性能矩阵的运算
  • 提供了大量能够快速便捷地处理数据的函数和方法
  • 应用于数据挖掘,数据分析
  • 提供数据清洗功能

增强图表可读性

  • 回忆我们在numpy当中创建学生成绩表样式:

  • 返回结果:

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

    如果数据展示为这样,可读性就会更友好:

  • 读取文件方便

官网:http://pandas.pydata.org/

数据读取与存储

我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格式,如CSV、SQL、XLS、JSON、HDF5。

注:最常用的HDF5和CSV文件

官方文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#csv-text-files

CSV

read_csv

  • pandas.read_csv(filepath_or_buffer, sep =',', usecols )
    • filepath_or_buffer:文件路径
    • sep :分隔符,默认用","隔开
    • usecols:指定读取的列名,列表形式
    • encoding:编码
  • 举例:读取之前的股票的数据
import pandas as pd

#设置显示全部行,不省略
pd.set_option('display.max_rows', None)
#设置显示全部列,不省略
pd.set_option('display.max_columns', None)
#设置显示全部列宽, 不省略
pd.set_option('display.max_colwidth', None)
"""
usecols 指定需要提取的列
"""
df = pd.read_csv('stock_day.csv',
                 sep=',',  # 分隔符,默认为逗号
                 # usecols=['open', 'high', 'close', 'low'],  # 指定获取的列
                 encoding='utf-8',
                 index_col=False,  # 是否读取索引
                 names=['开盘价', '最高价', '收盘价', '最低价'],  # 直接指定列明
                 engine='python'  # c 速度更快, python功能更完整
                 )
print(df)

df.to_csv('stock_day_back.csv')

to_csv

  • DataFrame.to_csv(path_or_buf=None, sep=', ’, columns=None, header=True, index=True, mode='w', encoding=None)
    • path_or_buf :文件路径
    • sep :分隔符,默认用","隔开
    • columns :选择需要的列索引
    • header :boolean or list of string, default True,是否写进列索引值
    • index:是否写进行索引
    • mode:'w':重写, 'a' 追加
  • 举例:保存读取出来的股票数据
    • 保存'open'列的数据,然后读取查看结果
# 选取10行数据保存,便于观察数据
df[:10].to_csv('stock_day_back.csv',
               index=False,  # 是否保留索引
               columns=['open']  # 保存列
               )

会发现将索引存入到文件当中,变成单独的一列数据。如果需要删除,可以指定index参数,删除原来的文件,重新保存一次。

# 读取,查看结果
pd.read_csv("stock_day_back.csv")

open
23.53
22.8
22.88
22.25
21.49
21.4
20.7
21.2
21.79
22.69

JSON

JSON是我们常用的一种数据交换格式,前面在前后端的交互经常用到,也会在存储的时候选择这种格式。所以我们需要知道Pandas如何进行读取和存储JSON格式。

read_json

pandas.read_json(path_or_buf=None, orient=None, typ='frame', lines=False)

  • 将JSON格式准换成默认的Pandas DataFrame格式

  • orient : string,Indication of expected JSON string format.

    • 'split' : dict like {index -> [index], columns -> [columns], data -> [values]}

      • split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
    • 'records' : list like [{column -> value}, ... , {column -> value}]

      • records 以columns:values的形式输出
    • 'index' : dict like {index -> {column -> value}}

      • index 以index:{columns:values}...的形式输出
    • 'columns' : dict like {column -> {index -> value}}

      ,默认该格式

      • colums 以columns:{index:values}的形式输出
  • lines : boolean, default False

    • 按照每行读取json对象
  • typ : default ‘frame’, 指定转换成的对象类型series或者dataframe

read_josn 案例

  • 数据介绍

这里使用一个新闻标题讽刺数据集,格式为json。is_sarcastic:1讽刺的,否则为0;headline:新闻报道的标题;article_link:链接到原始新闻文章。存储格式为:

[
  {
    "name": "邵帆",
    "job": "机修工",
    "address": "广西壮族自治区建国市花溪合肥街t座 303979"
  },
  {
    "name": "何丹丹",
    "job": "系统测试",
    "address": "湖北省沈阳市清城杨路b座 435741"
  },
  {
    "name": "范佳",
    "job": "汽车修理工",
    "address": "四川省建县丰都李街e座 707065"
  },
  {
    "name": "王云",
    "job": "服装/纺织/皮革工艺师",
    "address": "内蒙古自治区长沙市双滦巢湖路D座 438460"
  },
  {
    "name": "赵玉珍",
    "job": "ERP技术开发",
    "address": "吉林省玉华市崇文杨路l座 846818"
  },
  {
    "name": "倪阳",
    "job": "销售行政专员",
    "address": "甘肃省欢县怀柔重庆路H座 950331"
  },
  {
    "name": "成莉",
    "job": "麻醉医生",
    "address": "广西壮族自治区文市华龙余路q座 603504"
  },
  {
    "name": "任斌",
    "job": "其他",
    "address": "湖北省上海县东城长沙街D座 331924"
  },
  {
    "name": "赵霞",
    "job": "医疗器械注册",
    "address": "北京市燕市双滦澳门路I座 647751"
  },
  {
    "name": "黄莹",
    "job": "其他",
    "address": "福建省惠州县涪城王街j座 216044"
  }
]
  • 读取

orient指定存储的json格式,lines指定按照行去变成一个样本

import pandas as pd

df = pd.read_json('info-records.json',
                  orient='records'  # json 数据为字典
                  )
print(df)

结果为:

   name          job                   address
0   邵帆          机修工  广西壮族自治区建国市花溪合肥街t座 303979
1  何丹丹         系统测试       湖北省沈阳市清城杨路b座 435741
2   范佳        汽车修理工        四川省建县丰都李街e座 707065
3   王云  服装/纺织/皮革工艺师   内蒙古自治区长沙市双滦巢湖路D座 438460
4  赵玉珍      ERP技术开发       吉林省玉华市崇文杨路l座 846818
5   倪阳       销售行政专员       甘肃省欢县怀柔重庆路H座 950331
6   成莉         麻醉医生    广西壮族自治区文市华龙余路q座 603504
7   任斌           其他      湖北省上海县东城长沙街D座 331924
8   赵霞       医疗器械注册       北京市燕市双滦澳门路I座 647751
9   黄莹           其他       福建省惠州县涪城王街j座 216044

to_json

  • DataFrame.to_json(path_or_buf=None, orient=None,lines=False)

    • 将Pandas 对象存储为json格式
    • path_or_buf=None:文件地址
    • orient:存储的json形式,{‘split’,’records’,’index’,’columns’,’values’}
    • lines:一个对象存储为一行
  • 存储文件

    df.to_json('info-split.json',
               orient='split',
               # force_ascii=False,  # 是否编译为 ascii 编码
               date_format='utf-8'
               )
    

    结果

    {
    "columns":["name","job","address"],
    "index":[0,1,2,3,4,5,6,7,8,9],
    "data":[["邵帆","机修工","广西壮族自治区建国市花溪合肥街t座 303979"],["何丹丹","系统测试","湖北省沈阳市清城杨路b座 435741"],["范佳","汽车修理工","四川省建县丰都李街e座 707065"],["王云","服装\/纺织\/皮革工艺师","内蒙古自治区长沙市双滦巢湖路D座 438460"],["赵玉珍","ERP技术开发","吉林省玉华市崇文杨路l座 846818"],["倪阳","销售行政专员","甘肃省欢县怀柔重庆路H座 950331"],["成莉","麻醉医生","广西壮族自治区文市华龙余路q座 603504"],["任斌","其他","湖北省上海县东城长沙街D座 331924"],["赵霞","医疗器械注册","北京市燕市双滦澳门路I座 647751"],["黄莹","其他","福建省惠州县涪城王街j座 216044"]]}
    
  • index 模式

    df2.to_json('info-index.json',
                orient='index',
                force_ascii=False,  # 是否编译为 ascii 编码
                )
    

    结果

    {
    "0":{"name":"邵帆","job":"机修工","address":"广西壮族自治区建国市花溪合肥街t座 303979"},
    "1":{"name":"何丹丹","job":"系统测试","address":"湖北省沈阳市清城杨路b座 435741"},
    "2":{"name":"范佳","job":"汽车修理工","address":"四川省建县丰都李街e座 707065"},
    "3":{"name":"王云","job":"服装\/纺织\/皮革工艺师","address":"内蒙古自治区长沙市双滦巢湖路D座 438460"},
    "4":{"name":"赵玉珍","job":"ERP技术开发","address":"吉林省玉华市崇文杨路l座 846818"},
    "5":{"name":"倪阳","job":"销售行政专员","address":"甘肃省欢县怀柔重庆路H座 950331"},
    "6":{"name":"成莉","job":"麻醉医生","address":"广西壮族自治区文市华龙余路q座 603504"},
    "7":{"name":"任斌","job":"其他","address":"湖北省上海县东城长沙街D座 331924"},
    "8":{"name":"赵霞","job":"医疗器械注册","address":"北京市燕市双滦澳门路I座 647751"},
    "9":{"name":"黄莹","job":"其他","address":"福建省惠州县涪城王街j座 216044"}}
    
  • table 模式

    df3.to_json('info-table.json',
                orient='table',
                force_ascii=False)
    

    结果

    {
    "name":{"0":"邵帆","1":"何丹丹","2":"范佳","3":"王云","4":"赵玉珍","5":"倪阳","6":"成莉","7":"任斌","8":"赵            霞","9":"黄莹"},
    "job":{"0":"机修工","1":"系统测试","2":"汽车修理工","3":"服装\/纺织\/皮革工艺师","4":"ERP技术开发","5":"销售行政专        员","6":"麻醉医生","7":"其他","8":"医疗器械注册","9":"其他"},
    "address":{"0":"广西壮族自治区建国市花溪合肥街t座 303979","1":"湖北省沈阳市清城杨路b座 435741","2":"四川省建县丰都李街e            座 707065","3":"内蒙古自治区长沙市双滦巢湖路D座 438460","4":"吉林省玉华市崇文杨路l座 846818","5":"甘肃省欢县         怀柔重庆路H座 950331","6":"广西壮族自治区文市华龙余路q座 603504","7":"湖北省上海县东城长沙街D座                      331924","8":"北京市燕市双滦澳门路I座 647751","9":"福建省惠州县涪城王街j座 216044"}
    }
    

HDF5

read_hdf与to_hdf

HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame

  • pandas.read_hdf(path_or_buf,key =None,** kwargs)

    从h5文件当中读取数据

    • path_or_buffer:文件路径
    • key:读取的键
    • return:Theselected object
  • DataFrame.to_hdf(path_or_buf, key, *\kwargs*)

需要安装安装tables模块避免不能读取HDF5文件

pip install tables==3.6.1

文件操作

  • 读取文件
day_close = pd.read_hdf("day_close.h5")

print(day_close)
  • 存储文件
day_close.to_hdf("./data/test.h5", key="day_close")

再次读取的时候, 需要指定键的名字

new_close = pd.read_hdf("./data/test.h5", key="day_close")

注意:优先选择使用HDF5文件存储

  • HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的
  • 使用压缩可以提磁盘利用率,节省空间
  • HDF5还是跨平台的,可以轻松迁移到hadoop 上面

Excel

Excel是微软的经典之作,在日常工作中的数据整理、分析和可视化方面,有其独到的优势,尤其在你熟练应用了函数和数据透视等高级功能之后,Excel可以大幅度提高你的工作效率

  • 读取Excel

    • pd.read_excel('网易新闻.xlsx', sheet_name='表1')  # sheet_name可以是整型数字或者表的名字
      
    • pd.read_excel('网易新闻.xlsx', sheet_name='表1', skiprows=[0, 1, 2])  # skiprows 跳过特定行
      
    • pd.read_excel('网易新闻.xlsx', sheet_name='表1', nrows = 10)  # nrows 需要读取的行数
      
  • 保存Excel

    • df.to_excel('文件名.xlsx')
      

Pandas数据结构

Pandas中一共有三种数据结构,分别为:Series、DataFrame和MultiIndex(老版本中叫Panel )。

其中Series是一维数据结构,DataFrame是二维的表格型数据结构,MultiIndex是三维的数据结构。

Series

Series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据和与之相关的索引两部分构成。

Series的创建

# 导入pandas
import pandas as pd

pd.Series(data=None, index=None, dtype=None)
  • 参数:
    • data:传入的数据,可以是ndarray、list等
    • index:索引,必须是唯一的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
    • dtype:数据的类型

通过已有数据创建

  • 指定内容,默认索引
pd.Series(np.arange(5))

# 运行结果
0    0
1    1
2    2
3    3
4    4
dtype: int64

指定行索引名

示例代码:

ser3 = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
print(ser3)

运行结果:

a    0
b    1
c    2
d    3
e    4
dtype: int64

通过字典数据创建

ser4 = pd.Series({
   'red': 100, 'blue': 200, 'green': 500, 'yellow': 1000})
ser4

# 运行结果
blue       200
green      500
red        100
yellow    1000
dtype: int64

Series的属性

为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性index和values

  • index

    ser4.index
    
    # 结果
    Index(['blue', 'green', 'red', 'yellow'], dtype='object')
    
  • values

    ser4.values
    
    # 结果
    array([ 200,  500,  100, 1000])
    
  • 也可以使用索引来获取数据:

    ser4[2]
    
    # 结果
    100
    

DataFrame

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

  • 行索引,表明不同行,横向索引,叫index,0轴,axis=0
  • 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

DataFrame的创建

# 导入pandas
import pandas as pd

pd.DataFrame(data=None, index=None, columns=None)
  • 参数:
    • index:行标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
    • columns:列标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
通过已有数据创建

举例一:

pd.DataFrame(np.random.randn(2,3))

回忆咱们在前面直接使用np创建的数组显示方式,比较两者的区别。

举例二:创建学生成绩表

# "语文", "数学", "英语", "政治", "体育"
score = [
    [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]
]

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

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

# 生成10名同学,5门功课的数据
df1 = pd.DataFrame(score)
print('df2:\n', df1)

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

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

# 构造列索引序列
stu = ['同学' + str(i) for i in range(len(score))]

# 添加行索引
students = pd.DataFrame(score, columns=subjects, index=stu)
print('students:\n', students)

DataFrame的属性

  • shape

    print('students.shape:\t', students.shape)
    
    # 结果
    students.shape:     (10, 5)
    
  • index

    DataFrame的行索引列表

    print('students.index:\t', students.index)
    
    # 结果
    students.index:     Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object')
    
  • columns

    DataFrame的列索引列表

    print('students.columns:\t', students.columns)
    
    # 结果
    students.columns:     Index(['语文', '数学', '英语', '政治', '体育'], dtype='object')
    
  • values

    直接获取其中array的值

    print('students.values:\n', students.values)
    
    # 结果
    students.values:
     [[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]]
    
  • T

    转置

    students.T
    

    结果

  • head(5):显示前5行内容

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

    students.head(5)
    
  • tail(5):显示后5行内容

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

    students.tail(5)
    

DataFrame索引

需求:

修改行列索引值

stu = ["学生_" + str(i) for i in range(score_df.shape[0])]

# 必须整体全部修改
data.index = stu

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

# 错误修改方式
data.index[3] = '学生_3'

重设索引

  • reset_index(drop=False)
    • 设置新的下标索引
    • drop:默认为False,不删除原来索引,如果为True,删除原来的索引值
# 重置索引,drop=False

data.reset_index()

image-20190624100048415

# 重置索引,drop=True

data.reset_index(drop=True)

以某列值设置为新的索引

  • set_index(keys, drop=True)
    • keys : 列索引名成或者列索引名称的列表
    • drop : boolean, default True.当做新的索引,删除原来的列

设置新索引案例

1、创建

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

2、以月份设置新的索引

df.set_index('month')

# 输出
       sale  year
month
1      55    2012
4      40    2014
7      84    2013
10     31    2014

3、设置多个索引,以年和月份

df = df.set_index(['year', 'month'])
df

# 输出
            sale
year  month
2012  1     55
2014  4     40
2013  7     84
2014  10    31

注:通过刚才的设置,这样DataFrame就变成了一个具有 MultiIndex 的 DataFrame。

索引对象

Index索引

  1. Series和DataFrame中的索引都是Index对象

示例代码:

df = pd.DataFrame({
   'month': [1, 4, 7, 10],
                    'year': [2012, 2014, 2013, 2014],
                    'sale':[55, 40, 84, 31]})
se = pd.Series(np.arange(10))
df.index, se.index

运行结果:

(RangeIndex(start=0, stop=4, step=1), RangeIndex(start=0, stop=10, step=1))
  1. 索引对象不可变,保证了数据的安全

示例代码:

# 索引对象不可变
df.index[0] = 2

运行结果:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-23-7f40a356d7d1> in <module>()
      1 # 索引对象不可变
----> 2 df_obj2.index[0] = 2

/Users/Power/anaconda/lib/python3.6/site-packages/pandas/indexes/base.py in __setitem__(self, key, value)
   1402 
   1403     def __setitem__(self, key, value):
-> 1404         raise TypeError("Index does not support mutable operations")
   1405 
   1406     def __getitem__(self, key):

TypeError: Index does not support mutable operations

Pandas层级索引

下面创建一个Series, 在输入索引Index时,输入了由两个子list组成的list,第一个子list是外层索引,第二个list是内层索引。

示例代码:

import pandas as pd
import numpy as np

ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
print(ser_obj)

运行结果:

a  0    0.099174
   1   -0.310414
   2   -0.558047
b  0    1.742445
   1    1.152924
   2   -0.725332
c  0   -0.150638
   1    0.251660
   2    0.063387
d  0    1.080605
   1    0.567547
   2   -0.154148
dtype: float64
MultiIndex索引对象
  • 打印这个Series的索引类型,显示是MultiIndex
  • 直接将索引打印出来,可以看到有lavels,和labels两个信息。levels表示两个层级中分别有那些标签,labels是每个位置分别是什么标签。

示例代码:

print(type(ser_obj.index))
print(ser_obj.index)

运行结果:

<class 'pandas.indexes.multi.MultiIndex'>
MultiIndex([('a', 0),
            ('a', 1),
            ('a', 2),
            ('b', 0),
            ('b', 1),
            ('b', 2),
            ('c', 0),
            ('c', 1),
            ('c', 2),
            ('d', 0),
            ('d', 1),
            ('d', 2)],
           )
  • 取值
    • 根据索引获取数据。因为现在有两层索引,当通过外层索引获取数据的时候,可以直接利用外层索引的标签来获取。
    • 当要通过内层索引获取数据的时候,在list中传入两个元素,前者是表示要选取的外层索引,后者表示要选取的内层索引。
  1. 外层选取:

ser_obj['outer_label']

示例代码:

# 外层选取
print(ser_obj['c'])

运行结果:

0   -1.362096
1    1.558091
2   -0.452313
dtype: float64
  1. 内层选取:

ser_obj[:, 'inner_label']

示例代码:

# 内层选取
print(ser_obj[:, 2])

运行结果:

a    0.826662
b    0.015426
c   -0.452313
d   -0.051063
dtype: float64

常用于分组操作、透视表的生成等

小结

  • pandas的优势【了解】
    • 增强图表可读性
    • 便捷的数据处理能力
    • 读取文件方便
    • 封装了Matplotlib、Numpy的画图和计算
  • 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)
  • MultiIndex【了解】
    • multiIndex:
      • 类似ndarray中的三维数组
      • 创建:
        • pd.MultiIndex.from_arrays()
      • 属性:
        • 对象.index

基本操作

为了更好的理解这些基本操作,我们将读取一个真实的股票数据。关于文件操作,后面在介绍,这里只先用一下API

import pandas as pd

# 读取文件
df = pd.read_csv("stock_day.csv")
# print(df)

# 删除一些列,让数据更简单些,再去做后面的操作
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
print(df.head())

索引操作

Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名

称,甚至组合使用。

直接使用行列索引(先列后行)

获取'2018-02-27'这天的'close'的结果

# 直接使用行列索引名字的方式(先列后行)
print(df['open']['2018-02-27'])


"""
不支持的操作
print(data['2018-02-27']['open'])
print(data[:1, :2])
"""

结合loc或者iloc使用索引

获取从'2018-02-27':'2018-02-22','open'的结果

# 使用 loc 只能指定行列索引的名字
print(df.loc['2018-02-27':'2018-02-22', 'open'])

2018-02-27    23.53
2018-02-26    22.80
2018-02-23    22.88
Name: open, dtype: float64


# 使用 iloc 可以通过索引的下标去获取
# 获取前3天数据,前5列的结果
print(df.iloc[:3, :5])

            open    high    close    low
2018-02-27    23.53    25.88    24.16    23.53
2018-02-26    22.80    23.78    23.53    22.80
2018-02-23    22.88    23.37    22.82    22.71

获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果

# 获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果

# 推荐使用loc和iloc来获取的方式
print(df.loc[df.index[0:4], ['open', 'close', 'high', 'low']])
print(df.iloc[0:4, df.columns.get_indexer(['open', 'close', 'high', 'low'])])

# 结果
            open    close    high    low
2018-02-27    23.53    24.16    25.88    23.53
2018-02-26    22.80    23.53    23.78    22.80
2018-02-23    22.88    22.82    23.37    22.71
2018-02-22    22.25    22.28    22.76    22.02

赋值操作

对DataFrame当中的close列进行重新赋值为1

# 直接修改原来的值
df['close'] = 1
# 或者
df.close = 1

print(df.close)

排序

排序有两种形式,一种对于索引进行排序,一种对于内容进行排序

DataFrame 排序

  • 使用df.sort_values(by=, ascending=)
    • 单个键或者多个键进行排序,
    • 参数:
      • by:指定排序参考的键
      • ascending:默认升序
        • ascending=False:降序
        • ascending=True:升序
# 按照开盘价大小进行排序 , 使用ascending指定按照大小排序
print(df.sort_values(by="open", ascending=True).head())
# 按照多个键进行排序

print(df.sort_values(by=['open', 'high']).head())

image-20210703215934702

  • 使用 df.sort_index 给索引进行排序

这个股票的日期索引原来是从大到小,现在重新排序,从小到大

# 对索引进行排序
df.sort_index()

Series排序

  • 使用series.sort_values(ascending=True)进行排序

series排序时,只有一列,不需要参数

print(df['p_change'].sort_values(ascending=True).head())

2015-09-01   -10.03
2015-09-14   -10.02
2016-01-11   -10.02
2015-07-15   -10.02
2015-08-26   -10.01
Name: p_change, dtype: float64
  • 使用series.sort_index()进行排序
# 对索引进行排序
print(df['p_change'].sort_index().head())

2015-03-02    2.62
2015-03-03    1.44
2015-03-04    1.57
2015-03-05    2.02
2015-03-06    8.51
Name: p_change, dtype: float64

总结

  • 1.索引【掌握】
    • 直接索引 -- 先列后行,是需要通过索引的字符串进行获取
    • loc -- 先行后列,是需要通过索引的字符串进行获取
    • iloc -- 先行后列,是通过下标进行索引
  • 2.赋值【知道】
    • data[""] = **
    • data. =
  • 3.排序【知道】
    • dataframe
      • 对象.sort_values()
      • 对象.sort_index()
    • series
      • 对象.sort_values()
      • 对象.sort_index()
相关文章
|
3月前
|
数据挖掘 数据处理 Python
pandas的快速使用
pandas的快速使用
26 6
|
4月前
|
数据挖掘 大数据 索引
精通 Pandas:1~5
精通 Pandas:1~5
29 0
|
4月前
|
Python
精通 Pandas:6~11
精通 Pandas:6~11
18 0
|
3天前
|
索引 Python
【Pandas】- pandas入门
【Pandas】- pandas入门
|
5月前
|
API 索引 Python
pandas
使用pandas过程中出现的问题
61 0
|
8月前
|
存储 JSON 数据格式
|
11月前
|
SQL 数据采集 存储
什么是pandas
什么是pandas
84 0
|
12月前
|
数据挖掘 Python
pandas是什么
pandas是什么
|
12月前
|
存储 分布式计算 大数据
Pandas 2.0来了~
Pandas 2.0来了~
|
机器学习/深度学习 关系型数据库 数据挖掘
Pandas 2.0 vs Polars:速度的全面对比
前几天的文章,我们已经简单的介绍过Pandas 和Polars的速度对比。刚刚发布的Pandas 2.0速度得到了显著的提升。但是本次测试发现NumPy数组上的一些基本操作仍然更快。并且Polars 0.17.0,也在上周发布,并且也提到了性能的改善,所以我们这里做一个更详细的关于速度方面的评测。
205 0
Pandas 2.0 vs Polars:速度的全面对比