美文网首页我爱编程
数据分析工具Pandas

数据分析工具Pandas

作者: 卢子野 | 来源:发表于2018-01-24 20:55 被阅读0次

    Pandas简介

    什么是Pandas

    Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
    Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

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

    导入pandas
    import pandas as pd
    pd别名业界约定


    Pandas的数据结构

    Series

    Series是一种类似于一维数组的对象,组成:
    一组数据(各种NumPy数据类型)
    一组与之对应的索引(数据标签)
    索引(index)在左,数据(values)在右
    索引是自动创建的

    1.通过list构建series

    ser_obj = pd.series(range(10,30))#不指定索引的话,默认从0开始
    print(ser_obj)
    print(ser_obj.head(3))
    print(type(ser_obj))
    
    image.png
    2.通过dict构建series
    dict = {"Java":80,"php":85,"python":90}
    ser_obj = pd.Series(dict)
    print(ser_obj)
    
    image.png
    3.获取数据和索引
    ser_obj.inde 和 ser_obj.values
    #获取数据
    print(ser_obj.values)
    #获取索引
    print(ser_obj.index)
    
    image.png
    4.通过索引获取数据
    ser_obj[idx]
    #通过索引获取数据
    print(ser_obj1[0])
    print(ser_obj1[3])
    
    image.png
    5.设置名称
    对象名:ser_obj.name 给整个表起名字
    对象索引名:ser_obj.index.name给某一列
    ser_obj1.name = 'score'
    ser_obj1.index.name = 'subject'
    
    image.png

    DataFrame

    一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,数据是以二维结构存放的。
    类似多维数组/表格数据 (如,excel, R中的data.frame)
    每列数据可以是不同的类型
    索引包括列索引和行索引

    1.通过ndarray构建DataFrame

    arr_obj = np.random.rand(3,4)
    df_obj = pd.DataFrame(arr_obj)
    print(df_obj)
    print(df_obj.head(2)) #看前两行
    
    image.png

    2.通过dict构建DataFrame

    dict2 = { "A":1,
             "B":pd.Timestamp("20180124"),
             "C":pd.Series(range(10,14),dtype="float64"),
             "D":['Java','Python','C++',"php"],
             "E":np.array([3]*4)    
    }
    df_obj2 = pd.DataFrame(dict2)
    print(df_obj2)
    
    image.png
    3.通过索引获取列数据
    print(df_obj2['D'])
    print(type(df_obj2['D']))
    print(type(df_obj2['C']))
    print(type(df_obj2['A']))
    print(df_obj2.A)
    
    image.png
    4.增加列数据
    df_obj2['F'] = {"金水区":80,"二七区":75,"中原区":72,"高新区":88}
    print(df_obj2)
    
    image.png
    列数据增加
    df_obj2["H"] = df_obj["C"]+10
    
    image.png
    5.删除列
    del(df_obj2['E'])
    print(df_obj2)
    
    image.png

    Pandas的索引操作

    索引对象Index

    Series和Frame中的索引都是Index对象
    索引对象不可变,保证了数据的安全
    1.index指定行索引名
    不指定索引的话,默认从0开始

    ser_obj3 = pd.Series([1,2,3,6,7,8],index=['a','b','c','d','e','f'])
    print(ser_obj3)
    
    image.png
    2.行索引
    print(ser_obj3['c'])
    print(ser_obj3[3])
    
    image.png
    3.切片索引
    注意,按索引名切片操作时,是包含终止索引的。
    print(ser_obj3['b':'e'])
    print(ser_obj3[1:4])
    
    image.png
    4.不连续索引
    print(ser_obj3[['b','e','f']])
    
    image.png

    5.布尔索引

    bool_arr = ser_obj3 > 3
    print(bool_arr)
    
    image.png

    DataFrame索引

    1.columns指定列索引名

    df_obj5 = pd.DataFrame(np.random.randn(5,4),index = ['A','B','C','D','E'],columns=['a','b','c','d']) 
    print(df_obj5)
    
    image.png
    2.列索引
    print(df_obj5['b'])
    
    image.png
    print(df_obj5['b']['D'])
    
    image.png

    3.不连续索引

    print(df_obj5[['a','c']])
    
    image.png

    高级索引:标签、位置和混合

    1.loc标签索引
    loc是基于标签名的索引,也就是我们自定义的索引名

    print(df_obj5['b'])
    print(df_obj5[['b','d']])  # 不连续
    print(df_obj5.loc['A':'D','b':'d']) # 切片
    
    image.png
    print(ser_obj3['a'])
    print(ser_obj3.loc['a'])
    print(ser_obj3.loc[['a','b']])  # 不连续
    print(ser_obj3.loc['b':'d'])  # 切片
    
    
    image.png
    print(df_obj5['a']['A'])
    print(df_obj5[df_obj5['a']!=df_obj5['a'][2]])
    
    image.png
    2.iloc位置索引
    作用与loc一样,不过是给予索引编号来索引
    print(ser_obj3.iloc[1:3])
    
    image.png
    print(df_obj5.iloc[0:2,1:4])
    
    image.png
    3.ix标签与位置混合索引
    ix是以上二者的综合,既可以使用索引编号,又可以使用自定义索引,要视情况不同来使用
    如果索引既有数字又有英文,容易导致定位的混乱,那么这种方式不建议使用的
    # Series 对象
    print(ser_obj3.ix[0:3])
    print(ser_obj3.ix['b':'e'])
    #print(ser_obj3.ix['b':4])
    
    image.png
    # DataFrame对象
    print(df_obj5)
    print(df_obj5.ix[1:3,1:3])
    print(df_obj5.ix[1:3,'b':'d'])
    
    image.png

    Pandas的对齐运算

    是数据清洗的重要过程,可以按索引对齐进行运算,如果没对齐的位置则补NaN

    Series的对齐运算

    1.Series 按行、索引对齐

    ser_obj5 = pd.Series(range(10,20),index=range(10))
    ser_obj6 = pd.Series(range(15,20),index=range(5))
    print(ser_obj5)
    print(ser_obj6)
    
    image.png
    ser_obj5 + ser_obj6
    
    image.png
    print(ser_obj5.add(ser_obj6))
    
    image.png
    print(ser_obj5.add(ser_obj6,fill_value=0))
    
    image.png

    DataFrame的对齐运算

    DataFrame做对齐运算时,未对齐数据可以通过fill_value来指定数据做对齐运算
    add,sub,mul,div,加减乘除

    df_obj6 = pd.DataFrame(np.ones((2,2)),columns=['a','b'])
    print(df_obj6)
    df_obj7=pd.DataFrame(np.ones((5,4)),columns=['a','b','c','d'])
    print(df_obj7)
    
    image.png
    df_obj6 + df_obj7
    
    image.png
    df_obj6.add(df_obj7,fill_value=0)
    
    image.png
    df_obj6.add(df_obj7,fill_value=1)
    
    image.png
    df_obj8 = pd.DataFrame(np.random.randn(5,4)-1)
    print(df_obj8)
    
    image.png

    Pandas的函数应用

    1.可以直接使用numpy的函数
    在numpy里,可以对数组里的每一个元素进行操作的函数称为ufunc 通用函数(universal function)
    在Pandas里可以直接使用Numpy的ufunc

    print(df_obj8.abs())
    
    image.png
    2.通过apply将函数应用到列或行上
    f = lambda x:x.max()
    print(df_obj8.apply(f))
    
    image.png
    3.通过applymap将函数应用到每个数据上,只用于DataFrame
    # 取DataFrame对象中每一个浮点数小数点后两位
    print(df_obj8.applymap(lambda x:"%.2f"%x))
    
    image.png

    ps:
    DataFrame对象可以用apply()和applymap()
    apply()应用于行,列,可以通过axis来指定
    Series对象只能用apply ,效果等于Pyton的map()
    ser_obj.map(func)
    ser_obj.apply(func)

    4.排序

    分为按索引排序和按值排序
    4.1索引排序
    sort_index()
    排序默认为升序排序,asscending=False为降序排序

    # Series 
    ser_obj8 = pd.Series(range(10,15),index=np.random.randint(5,size=5))
    print(ser_obj8)
    
    image.png
    sorted_obj = ser_obj8.sort_index()
    print(sorted_obj)
    print(type(sorted_obj))
    
    image.png
    print(ser_obj8.sort_index(ascending=False))
    
    image.png

    对DataFrame操作时注意轴方向,默认列,axis = 1 为行

    df_obj9 = pd.DataFrame(np.random.randn(3,5),index=np.random.randint(3,size=3),columns=np.random.randint(5,size=5))
    print(df_obj9)
    
    image.png
    # 默认情况下 ,按行索引排序,升序
    print(df_obj9.sort_index())
    
    image.png
    print(df_obj9.sort_index(axis=1,ascending=False))
    
    image.png
    4.2按值排序
    sort_values(by='column name')
    根据某个唯一的列名进行排序,如果有其他相同列名则报错
    series 对象的按值排序
    # series 对象的按值排序
    ser_obj9 = pd.Series(np.random.randint(10,20,size=10))
    print(ser_obj9)
    
    image.png
    # 默认 升序
    print(ser_obj9.sort_values())
    
    image.png
    # ascending = false 降序
    print(ser_obj9.sort_values(ascending=False))
    
    image.png
    Dataframe对象按值排序
    df_obj10 = pd.DataFrame(np.random.randn(3,5),index=np.random.randint(3,size=3),columns=np.random.randint(5,size=5))
    print(df_obj10)
    
    image.png
    # 默认的按列排序
    print(df_obj10.sort_values(by=0))
    
    image.png
    print(df_obj10.sort_values(by=1,axis=1,ascending=False))
    
    image.png
    4.3处理缺失数据
    df_obj11 = pd.DataFrame(
        [[1,2,3,np.nan],
        [4,5,np.nan,6],
        [7,8,9,np.nan],
        list(range(4))]
    )
    print(df_obj11)
    
    image.png
    print(df_obj11.isnull())
    
    image.png
    丢弃
    print(df_obj11.dropna())
    
    print(df_obj11.dropna(axis=1))
    
    image.png

    填充

    print(df_obj11.fillna(3.14))
    
    image.png

    相关文章

      网友评论

        本文标题:数据分析工具Pandas

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