zoukankan      html  css  js  c++  java
  • python数据分析第二版:pandas

    一:pandas

    两种数据结构:series和dataframe

      series:索引(索引自动生成)和标签(人为定义)组成---返回一个对象

    obj = pd.Series([1,2,3,4])
    obj
    # 结果 0 1 1 2 2 3 3 4 dtype: int64
    obj
    = pd.Series(["姓名","年龄","身高","体重"]) obj
    # 结果 0 姓名 1 年龄 2 身高 3 体重 dtype: object

    obj.values
    array(['姓名', '年龄', '身高', '体重'], dtype=object)
    obj.index
    RangeIndex(start=0, stop=4, step=1)

     指定索引

    obj = pd.Series(["姓名","年龄","身高","体重"],index=[5,4,3,2])
    obj
    5    姓名
    4    年龄
    3    身高
    2    体重
    dtype: object

     通过索引取值

    # 取一个值
    obj[2] '体重'
    # 取一组值
    obj[[2,3,5]] 2 体重 3 身高 5 姓名 dtype: object

     保留索引值的链接

    obj = pd.Series([1,2,3,4],index=["a","b","c","d"])
    obj
    
    a    1
    b    2
    c    3
    d    4
    dtype: int64
    
    obj[obj>2]
    c    3
    d    4
    dtype: int64
    np.exp(obj)
    a     2.718282   e ** 1
    b     7.389056   e ** 2
    c    20.085537   e ** 3
    d    54.598150  e **4
    dtype: float64

     series看做一个字典,它是索引到数据值的一个映射

    "a" in obj
    True

    python字典直接创建series

    data = {"姓名":"周琦","年龄":25,"国籍":"波兰","特点":"发球失误"}
    ret = pd.Series(data)
    ret
    # 结果  --- 键作为索引,值作为数据值
    姓名      周琦
    年龄      25
    国籍      波兰
    特点    发球失误
    dtype: object

     指定索引的顺序展示字典

    index = ["特点","国籍","年龄","姓名"]
    ret = pd.Series(data,index=index)
    ret
    特点    发球失误
    国籍      波兰
    年龄      25
    姓名      周琦
    dtype: object

    缺少数据的表示

    index = ["特点","国籍","年龄","姓名","年薪"]
    ret = pd.Series(data,index=index)
    ret
    特点    发球失误
    国籍      波兰
    年龄      25
    姓名      周琦
    年薪     NaN     # 缺少的数据就用NaN表示
    dtype: object

     数据集中缺少的数据的检测

    pd.isnull(ret)
    特点    False
    国籍    False
    年龄    False
    姓名    False
    年薪     True
    dtype: bool
    
    
    pd.notnull(ret)
    特点     True
    国籍     True
    年龄     True
    姓名     True
    年薪    False
    dtype: bool

     series的加法运算

    data1 = {"西安":100,"郑州":200,"太原":300,"武汉":400}
    data2 = {"西安":500,"辽宁":200,"太原":300,"南京":400}
    ret1 = pd.Series(data1)
    ret2 = pd.Series(data2)
    ret1 + ret2
    
    南京      NaN
    太原    600.0
    武汉      NaN
    西安    600.0
    辽宁      NaN
    郑州      NaN
    dtype: float64

    给series对象和索引命名

    ret1.name = "全国城市活力打分值"
    ret1.index.name =  "城市名称"
    ret1
    
    城市名称
    西安    100
    郑州    200
    太原    300
    武汉    400
    Name: 全国城市活力打分值, dtype: int64

     修改索引值

    ret1.index = ['杭州', '上海', '合肥', '福州']  通过赋值的方式修改索引值
    ret1
    
    杭州    100
    上海    200
    合肥    300
    福州    400
    Name: 分值, dtype: int64

    DataFrame

      DataFrame是一个表格类型的数据结构,含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)

      DataFrame既有行索引也有列索引,数据是一个或多个二维块存放的(而不是列表,字典,或者其他的一维数据结构)---具体细节后面会讨论

    data = {"City":["guangzhou","shanghai","beijing","shenzhen"],
            "People":[2000,1500,2500,1500],
            "School":["华南理工大学","上海交通大学","北京大学","深圳大学"],
            "Representative":["广州塔","世贸中心","故宫","华为"]}
    frame = pd.DataFrame(data)
    frame

    指定列序列的排序方式

    data = {"City":["guangzhou","shanghai","beijing","shenzhen"],
            "People":[2000,1500,2500,1500],
            "School":["华南理工大学","上海交通大学","北京大学","深圳大学"],
            "Representative":["广州塔","世贸中心","故宫","华为"]}
    frame = pd.DataFrame(data,columns=["Representative","School","People","City"])  # 指定次序
    frame

    没有数据就会显示缺失值

    data = {"City":["guangzhou","shanghai","beijing","shenzhen"],
            "People":[2000,1500,2500,1500],
            "School":["华南理工大学","上海交通大学","北京大学","深圳大学"],
            "Representative":["广州塔","世贸中心","故宫","华为"]}
    frame = pd.DataFrame(data,columns=["Representative","School","People","City","Gdp","PM2.5"])  # "Gdp","PM2.5" 这两个是不存在的
    frame


    通过获取属性,可以获得一个series的列

    frame["City"]
    
    0    guangzhou
    1     shanghai
    2      beijing
    3     shenzhen
    Name: City, dtype: object

    获取行:通过索引获取

    frame.loc[0]
    # 
    Representative          广州塔
    School               华南理工大学
    People                 2000
    City              guangzhou
    Gdp                     NaN
    PM2.5                   NaN
    Name: 0, dtype: object

     列值的修改:标量值,例如要给空列PM2.5赋值:100

    fram["PM2.5"] = 100

     列值的修改:一组值

    frame["Gdp"] = [100,200,300,400]
    frame

     列值的修改:最精确版本,通过series索引的方式进行赋值

    val = pd.Series([211,633,770,1003],index=[0,3,2,1])
    frame["PM2.5"] = val
    frame
    # 结果


     列值的修改:不存在的列将会多一个新列

    val = pd.Series([1,3,4,2],index=[0,3,2,1])
    # 不存在的列
    frame["happy_index"] = val
    frame
    # 结果

     列的添加

    # 添加一个新列,用bool值表示
    frame["test"] = frame["PM2.5"] > 60
    frame
    
    #结果

     删除列:删除上面新增的列test

    del frame["test"]
    frame
    
    #结果

     复制列:字典嵌套

    pop = {"guangzhou":{0,2000}}
    frame2 = pd.DataFrame(pop)
    frame2
    
    # 结果
    
    
    frame
    
    # 结果

    交换行和列:转置

    frame.T
    
    # 结果

     指明索引的复制  # TODO

    index的name属性,和columns的name属性

    frame.index.name = "information"
    frame.columns.name = "introduction"
    frame
    
    # 结果

    DataFrame的valus值获取:返回数组

    frame.values
    
    # 结果 
    array([['广州塔', '华南理工大学', 2000, 'guangzhou', nan, nan],
           ['世贸中心', '上海交通大学', 1500, 'shanghai', nan, nan],
           ['故宫', '北京大学', 2500, 'beijing', nan, nan],
           ['华为', '深圳大学', 1500, 'shenzhen', nan, nan]], dtype=object)

    pandas中的index可以存在重复值

    lable = pd.Index([0,0,1,1])
    lable
    # 
    Int64Index([0, 0, 1, 1], dtype='int64')
    
    data = pd.Series(["a","b","c","d"],index=lable)
    data
    # 
    0    a
    0    b
    1    c
    1    d
    dtype: object
    
    data[0]
    0    a
    0    b
    dtype: object
    
    data[1]
    
    1    c
    1    d
    dtype: object

    基本功能使用

     一:重新索引

      pandas的一个重要的方法就是重新索引,reindex,作用是创建一个新的对象,它的数据符合新的索引

    data = pd.Series([1,2,3,4],index=["a","d","c","b"])
    data
    # 结果
    a    1
    d    2
    c    3
    b    4
    dtype: int64

    用该Series的重新索引,就会对根据新索引进行排序,如果某个索引值不在,就引入缺省值

    data1 = data.reindex(["a","b","c","d","e","f"])
    data1
    
    # 结果
    a    1.0
    b    4.0
    c    3.0
    d    2.0
    e    NaN
    f    NaN
    dtype: float64

    对于时间序列这样的有顺序排序,重新索引可能需要做一些插值处理

    data = pd.Series(["a","d","c","b"],index=[0,2,4,6])
    data
    # 结果---索引值不连续,不符合要求,怎么修改呢?
    
    0    a
    2    d
    4    c
    6    b
    dtype: object
    
    data1 = data.reindex(range(8),method="ffill")
    data1
    
    # 结果变成连续索引
    0    a
    1    a
    2    d
    3    d
    4    c
    5    c
    6    b
    7    b

     借助,DataFrame,reindex可以修改(行)索引和列,传递一个序列时,会重新索引结果的行

    frame = pd.DataFrame(np.arange(9).reshape((3,3)),index=["a","b","c"],columns=["Ohio","Texas","California"])
    frame
    
    # 结果


    frame1 = frame.reindex(["a","b","c","d","e"])  # reindex重新索引了,并增加了缺省值,而且数组形状也会自动进行调整。
    frame1

    # 行索引

     列可以用columns的关键字进行索引

    states = ["Ohio","Texas","California","NewYork","Washington"]
    frame1.reindex(columns = states)
    
    # 结果

     

    对于Series:删除指定索引的值:drop,返回删除后的结果

    data = pd.Series(np.arange(5),index=["a","b","c","d","e"])
    data
    
    # 结果
    a    0
    b    1
    c    2
    d    3
    e    4
    dtype: int32
    
    new_data = data.drop("c")
    new_data
    
    # 结果
    a    0
    b    1
    d    3
    e    4
    dtype: int32

    new_data = data.drop(["a","c"])
    new_data

    # 结果

    b 1
    d 3
    e 4
    dtype: int32

     对于DataFrame删除指定的索引:

    data = pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=["上海","北京","广州","深圳"])
    data
    
    # 结果
    
    
    
    new_data = data.drop([4])  # 直接删行
    new_data
    
    # 结果


    result_data = data.drop("广州",axis="columns")  # 直接删列
    result_data

    # 结果

    就地删除,不用新的对象进行接收的方法  inplace = True

    data.drop(["广州","深圳"],axis="columns",inplace=True)
    
    data
    # 结果


    # 谨慎使用,它会消除被删的数据

     索引、选取、过滤

    data = pd.Series(np.arange(4.),index=["a","b","c","d"])
    data
    # 
    a    0.0
    b    1.0
    c    2.0
    d    3.0
    dtype: float64
    
    data["d"]  # 按照索引取值
    3.0  
    
    data[2:4] # 按照值区间进行索引
    
    c    2.0
    d    3.0
    dtype: float64
    
    data[["a","c","d"]] # 取多个索引的值
    
    a    0.0
    c    2.0
    d    3.0
    dtype: float64
    
    data[data<3] # 按照条件查询
    a    0.0
    b    1.0
    c    2.0
    dtype: float64
    
    
    data["a":"d"]  # 索引切片是包含最后一个值的
    a    0.0
    b    1.0
    c    2.0
    d    3.0
    dtype: float64

     切片赋值

    data["a":"d"] = 100
    data
    
    # 
    a    100.0
    b    100.0
    c    100.0
    d    100.0
    dtype: float64

     DataFrame的索引和切片

    data = pd.DataFrame(np.arange(16).reshape((4,4)),index=["shanghai","shenzhen","beijing","chongqing"],columns=["one","two","three","four"])
    data
    
    # 
    
    data["two"]     # 一般的值索引就是获取列
    # 
    shanghai      1
    shenzhen      5
    beijing       9
    chongqing    13
    Name: two, dtype: int32
    
    data[["three","one"]]
    # 
    
    
    data[:2]   # 切片一般都是对行进行切片
    
    #
    
    data[data["three"] > 5]
    #

     通过bool型进行索引

    data < 10
    
    #结果
    

    
    data[data<10] = 100
    data
    
    # 结果

     DataFrame的标签运算符,loc和iloc

    data = pd.DataFrame(np.arange(16).reshape((4,4)),index=["shanghai","shenzhen","beijing","chongqing"],columns=["one","two","three","four"])
    data
    # 
    
    
    data.loc["shanghai",["two","four"]]    #loc["哪一行",["第几列","第几列"]
    
    # 
    two     100
    four    100
    Name: shanghai, dtype: int32
    
    data.loc["two",["shenzhen","chongqing"]]
    # 报错 KeyError: 'two'  # 这里应该是行的标签,不能是列的标签
    data.iloc[2,[1,2,3]]  # iloc用行的索引值进行选,再用列的索引值进行选
    # 
    two       9
    three    10
    four     11
    Name: beijing, dtype: int32

     loc和iloc两个函数也适合一个标签或多个标签的索引切片

    data.loc[:"beijing",["one","two"]]
    
    # 结果

    data = pd.DataFrame(np.arange(16).reshape((4,4)),index=["shanghai","shenzhen","beijing","chongqing"],columns=["one","two","three","four"])
    data
    # 
    

    data.iloc[1:3,0:3][data.one > 0]  # 1:3 --行索引的切片,0:3列索引的切片,data.one > 0 对值的范围进行限制
    # 结果

     

    整数索引:比较难

    data = pd.Series(np.arange(3.))
    data
    # 
    0    0.0
    1    1.0
    2    2.0
    dtype: float64
    
    data[-1]  # 用整数索引带来的不变,非整数索引可以很高的取代这个问题
    # 错误:KeyError: -1
    
    data = pd.Series(np.arange(3.),index=["a","b","c"])
    data
    #
    a    0.0
    b    1.0
    c    2.0
    dtype: float64
    data[-1]
    # 
    2.0

     如果轴索引使用了整数,数据选取总会使用标签,为了准确,请使用loc或者iloc进行取值

    # 对于上面的data[-1]报键错误的情况,可以使用iloc进行准确定位
    
    data.iloc[-1]
    #  
    2.0

    算数运算

    data1 = pd.Series(np.arange(3),index=["a","b","c"])
    data2 = pd.Series(np.arange(5),index=["a","b","c","d","e"])
    
    data1
    #
    a    0
    b    1
    c    2
    dtype: int32
    
    data2
    #
    a    0
    b    1
    c    2
    d    3
    e    4
    dtype: int32
    
    data1 + data2
    #
    a    0.0
    b    2.0
    c    4.0
    d    NaN   # data1没有这个索引--缺失值代替
    e    NaN   # data1没有这个索引
    dtype: float64

     对齐操作:dataframe

    data1 = pd.DataFrame(np.arange(9).reshape((3,3)),index=["a","b","c"],columns=["huawei","oppo","xiaomi"])
    data2 = pd.DataFrame(np.arange(12).reshape((4,3)),index=["a","b","c","d"],columns=["huawei","apple","xiaomi"])
    data1
    #
    
    data2
    # 
    
    data1 + data2
    # 
    
    

    算数方法中填充值

    如果:给data1中添加一列B,data2中添加一列A,不就可以解决互相相加不全部为NaN的情况了吗?

    B = pd.Series(np.arange(2))
    data1.insert(1,"B",B)    #insert(添加的列的索引值,添加的列的名称,添加列的数据)
    # 
    
      
    A = pd.Series(np.arange(2))
    data2.insert(1,"A",A)
    #
    data1 + data2 #
      
    
    
    填充值:fill_value = 0

                        

     DataFrame和Seriea之间的运算

    1:numpy的广播效应

     

     2.dataframe - series的广播效应

    3.没有的行货列,进行算数运算是会使用NaN

     4,想让列和列进行加减,必须使用函数进行,还要指明轴

    frame = pd.DataFrame(np.arange(12).reshape((3,4)),index=["zhang","wang","li"],columns=["name","age","hometown","gender"])
    frame
    series
    = frame["name"] series
    zhang 0 wang
    4 li 8 Name: name, dtype: int32 frame - series
    frame.sub(series,axis="index")   # 列和列相减的标准写法,axis="index", 当axis="columns" 全部都为NaN

    
    

















































  • 相关阅读:
    Storm的并行度、Grouping策略以及消息可靠处理机制简介
    storm入门原理介绍
    Kafka学习笔记-Java简单操作
    批量复制word文档,并生成以日期为后缀名的批量文档攻略,批量生成word文档
    数组
    分支结构,循环结构学习整理
    java中的运算符
    Java中的变量和基本数据类型知识
    Java开发环境描述
    使用Map,统计字符串中每个字符出现的次数
  • 原文地址:https://www.cnblogs.com/meloncodezhang/p/11581293.html
Copyright © 2011-2022 走看看