zoukankan      html  css  js  c++  java
  • 数据分析 二 Pandas的数据结构 Series DataFrame

    import pandas as pd
    from pandas import Series,DataFrame
    import numpy as np

    1、Series

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

    • values:一组数据(ndarray类型)
    • index:相关的数据索引标签

    1)Series的创建

    两种创建方式:

    (1) 由列表或numpy数组创建

    默认索引为0到N-1的整数型索引

    #使用列表创建Series
    Series(data=[1,2,3,4,5])

    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int64


    Series(data=np.random.randint(0,100,size=(10,)))
    0     5
    1     1
    2    34
    3     1
    4    20
    5    62
    6    39
    7     5
    8     1
    9     1
    dtype: int32

    • 还可以通过设置index参数指定索引

    Series(data=[1,2,3],index=['a','b','c']) #显式索引

    a    1
    b    2
    c    3
    dtype: int64

    2)Series的索引和切片

    可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的是一个Series类型)。

    (1) 显式索引:

    - 使用index中的元素作为索引值
    - 使用s.loc[](推荐):注意,loc中括号中放置的一定是显示索引

    注意,此时是闭区间

    s = Series([1,2,3,4,5],index=['a','b','c','d','e'])

    s[0]
    s['a']
    s.a

    ==》 1

    (2) 隐式索引:

    - 使用整数作为索引值
    - 使用.iloc[](推荐):iloc中的中括号中必须放置隐式索引

    注意,此时是半开区间

    s[1:3]      1可以取到。3取不到 [ ..)

    b   2
    c    3
    dtype: int64 a 1


    s['a':'d']      可以取到 [ ..]    闭合区间

    a  1 

    b   2
    c    3
    d    4
    dtype: int64



    3)Series的基本概念

    可以使用s.head(),tail()分别查看前n个和后n个值

    s.head(3)

    a    1
    b    2
    c    3
    dtype: int64

    对Series元素进行去重

        s = Series([1,1,2,2,3,4,5,56,6,7,78,8,89])
        s.unique()     # 去重

        array([ 1,  2,  3,  4,  5, 56,  6,  7, 78,  8, 89], dtype=int64)


    当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况

    使得两个Series进行相加

    s1 = Series([1,2,3],index=['a','b','c'])
    s2 = Series([1,2,3],index=['a','d','c'])
    s = s1 + s2

    a    2.0
    b    NaN
    c    6.0
    d    NaN
    dtype: float64

    可以使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函数检测缺失数据
     

    s.isnull()

    a    False
    b     True
    c    False
    d     True
    dtype: bool

    s.notnull()
    a     True
    b    False
    c     True
    d    False
    dtype: bool

    s[s.notnull()] #达到去空效果
    a    2.0
    c    6.0
    dtype: float64

    (3) Series之间的运算

    • 在运算中自动对齐不同索引的数据
    • 如果索引不对应,则补NaN

    2、DataFrame == mysql的table

    DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

    • 行索引:index
    • 列索引:columns
    • 值:values

    1)DataFrame的创建

    最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。

    此外,DataFrame会自动加上每一行的索引。

    使用字典创建的DataFrame后,则columns参数将不可被使用。

    同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。

    • 使用ndarray创建DataFrame
    df = DataFrame(data=np.random.randint(0,100,size=(3,4)),index=['a','b','c'],columns=['A','B','C','D'])
    print(df)

      A   B    C D
    a  71 16  74 73
    b  5   80   9  59
    c  43  6    45  6

    DataFrame属性:values、columns、index、shape

    df.values     值
    df.columns  列名
    df.index   行名
    df.shape   形状 行列数

    使用ndarray创建DataFrame:创建一个表格用于展示张三,李四,王五的java,python的成绩

    dic = {
        "张三":[150,150,15,0],
        "李四":[1,1,3,2]
    }
    df = DataFrame(data=dic,index=["语文","数学","英语","??"])
    print(df)

      张三 李四
    语文 150   1
    数学 150   1
    英语 15     3
     ??    0      2

    2)DataFrame的索引

     

    (1) 对列进行索引

    - 通过类似字典的方式  df['q']
    - 通过属性的方式     df.q

    可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。

    df['张三']

    语文    150
    数学    150
    英语    150
    理综    150
    Name: 张三, dtype: int64

    #获取前两列
    df[['李四','张三']]

    (2) 对行进行索引
    - 使用.loc[]以index来进行行索引
    - 使用.iloc[]以整数来进行行索引

    同样返回一个Series,index为原来的columns。

    df.loc['语文']

    张三    150
    李四      0
    Name: 语文, dtype: int64
    df.iloc[0]

    张三    150
    李四      0
    Name: 语文, dtype: int64

    df.iloc[[0,1]]

      张三 李四
    语文150 0
    数学150 0

    (3)对元素索引的方法

    - 使用列索引
    - 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在后

    df['张三']['英语']

    ===>150
    df.loc['英语','张三'] (行名在前)
    150

    df.loc[['数学','理综'],'张三']
    数学    150
    理综    150
    Name: 张三, dtype: int64

    切片:

     

    【注意】 直接用中括号时:

    • 索引表示的是列索引
    • 切片表示的是行切片
    df[0:2]

    张三 李四
    语文 150 1
    数学 150 1

    在loc和iloc中使用切片(切列) : df.loc['B':'C','丙':'丁']

    df.iloc[:,0:1]

    张三
    语文 150
    数学 150
    英语 15
    ?? 0

    • 索引
      • df[列索引]:取一列
      • df[[col1,col2]]:取出两列
      • df.loc[显式的行索引]:取行
      • df.loc[行,列]:取元素
    • 切片:
      • df[index1:index3]:切行
      • df.loc[col1:col3]:切列

    3)DataFrame的运算

     

    (1) DataFrame之间的运算

    同Series一样:

    • 在运算中自动对齐不同索引的数据
    • 如果索引不对应,则补NaN
     

    练习6:

    1. 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。

    2. 假设张三期中考试数学被发现作弊,要记为0分,如何实现?

    3. 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?

    4. 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?

    qizhong = df
    qimo = df
    (qizhong + qimo)/2
    qizhong.loc['数学','张三'] = 0
    qizhong
    qizhong['李四'] += 100
    qizhong
    qizhong += 10
    qizhong
    • 使用tushare包获取某股票的历史行情数据。
    • 输出该股票所有收盘比开盘上涨3%以上的日期。
    • 输出该股票所有开盘比前日收盘跌幅超过2%的日期。
    • 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
     
    • 使用tushare包获取某股票的历史行情数据
      • pip install tushare
    import tushare as ts 
    import pandas as pd
    # ts.set_token('baa556745a2b764769a7d8ad06f78f6ffe9a441fd7fdb0b256e03345')
    # pro = ts.pro_api()
    # df = pro.daily(ts_code='600000.SH', start_date='20180701', end_date='20190918')
    # print(df.head(10))
    # df.to_csv('./pufa.csv')
    # print(type(df['trade_date'][2]))
    df = pd.read_csv('./pufa.csv',index_col='trade_date',parse_dates=['trade_date'])
    df.drop(labels='Unnamed: 0',axis=1,inplace=True)
    #(收盘-开盘)/开盘 > 0.03
    (df['close'] - df['open']) / df['open'] > 0.03
    #True:满足需求
    #false:不满足
    
    #返回了满足需求的行数据
    df.loc[(df['close'] - df['open']) / df['open'] > 0.03]
    #获取了满足需求的日期
    df.loc[(df['close'] - df['open']) / df['open'] > 0.03].index
    
    #结论:如果获取了一组布尔值,接下来改组布尔值就直接作为元数据的行索引
    (df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02
    
    #满足需求的行数据
    df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02].index
  • 相关阅读:
    求解答可用性测试记
    Teambition可用性测试记
    海丁网可用性测试记
    go语言的切片
    go语言的数组
    go语言的函数
    go语言的接口
    go语言的结构体
    go语言的flag
    创建二叉树和三种遍历
  • 原文地址:https://www.cnblogs.com/zhuangdd/p/14174186.html
Copyright © 2011-2022 走看看