zoukankan      html  css  js  c++  java
  • python--Pandas(一)

    一、Pandas简介

    1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
    pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。 2、Pandas 是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。
    Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。
    panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。 3、数据结构: Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。 Time- Series:以时间为索引的Series。 DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。 Panel :三维的数组,可以理解为DataFrame的容器。 Pandas 有两种自己独有的基本数据结构。读者应该注意的是,它固然有着两种数据结构,因为它依然是 Python 的一个库,所以,Python 中有的数据类型在这里依然适用,也同样还可以使用类自己定义数据类型。
    只不过,Pandas 里面又定义了两种数据类型:Series 和 DataFrame,它们让数据操作更简单了。

    pandas 基本使用

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    s = pd.Series([1,3,5,np.nan,6,8])
    '''
    >>> s
    0    1.0
    1    3.0
    2    5.0
    3    NaN
    4    6.0
    5    8.0
    dtype: float64
    '''
    
    dates =  pd.date_range('20180330',periods=6)
    '''
    DatetimeIndex(['2018-03-30', '2018-03-31', '2018-04-01', '2018-04-02',
                   '2018-04-03', '2018-04-04'],
                  dtype='datetime64[ns]', freq='D')
    '''
    df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
    '''
                       A         B         C         D
    2018-03-30  1.421753 -0.835878  1.077365  0.407735
    2018-03-31 -0.608609 -1.148211 -1.174397  0.108209
    2018-04-01 -0.635743  1.759105  0.375025  1.558345
    2018-04-02  0.829423  1.506339  0.858323  0.867596
    2018-04-03  0.443178 -1.083932 -0.179227 -0.485547
    2018-04-04 -0.913496  0.320855 -0.940977  0.877651
    '''
    df2 = pd.DataFrame({
        'A':1,
        'B':pd.Timestamp('20130102'),
        'C':pd.Series(1,index=list(range(4)),dtype='float32'),
        'D':np.array([3]*4,dtype='int32'),
        'E':pd.Categorical(['test','train','test','train']),
        'F':'foo'})
    '''
       A          B    C  D      E    F
    0  1 2013-01-02  1.0  3   test  foo
    1  1 2013-01-02  1.0  3  train  foo
    2  1 2013-01-02  1.0  3   test  foo
    3  1 2013-01-02  1.0  3  train  foo
    '''
    print(df2.dtypes)
    '''
    A             int64
    B    datetime64[ns]
    C           float32
    D             int32
    E          category
    F            object
    dtype: object
    '''
    '''
    >>> df2.head(2)    #显示前面2行
       A          B    C  D      E    F
    0  1 2013-01-02  1.0  3   test  foo
    1  1 2013-01-02  1.0  3  train  foo
    >>> df2.tail(2)       #显示后面2行
       A          B    C  D      E    F
    2  1 2013-01-02  1.0  3   test  foo
    3  1 2013-01-02  1.0  3  train  foo
    >>> df.index
    DatetimeIndex(['2018-03-30', '2018-03-31', '2018-04-01', '2018-04-02',
                   '2018-04-03', '2018-04-04'],
                  dtype='datetime64[ns]', freq='D')
    >>> df.columns
    Index(['A', 'B', 'C', 'D'], dtype='object')
    >>> df.values
    array([[-0.7399801 ,  0.63228899, -0.19250377,  1.13034102],
           [-1.62267282,  0.26772863,  0.14344581,  0.69354685],
           [-1.08605314, -1.02026368, -0.22525268,  1.3305295 ],
           [ 0.75133965, -1.15389799, -0.60457632,  1.93324854],
           [-1.07516695, -0.52292111,  2.5930546 , -0.69028129],
           [ 0.56341006,  0.73365219,  0.52632723,  0.85383304]])
    >>> df.describe()   #快速计算出数据的统计描述
                  A         B         C         D
    count  6.000000  6.000000  6.000000  6.000000
    mean  -0.534854 -0.177235  0.373416  0.875203
    std    0.967643  0.832719  1.152233  0.880463
    min   -1.622673 -1.153898 -0.604576 -0.690281
    25%   -1.083332 -0.895928 -0.217065  0.733618
    50%   -0.907574 -0.127596 -0.024529  0.992087
    75%    0.237563  0.541149  0.430607  1.280482
    max    0.751340  0.733652  2.593055  1.933249
    
    >>> df.T   #对数据进行转置
       2018-03-30  2018-03-31  2018-04-01  2018-04-02  2018-04-03  2018-04-04
    A   -0.739980   -1.622673   -1.086053    0.751340   -1.075167    0.563410
    B    0.632289    0.267729   -1.020264   -1.153898   -0.522921    0.733652
    C   -0.192504    0.143446   -0.225253   -0.604576    2.593055    0.526327
    D    1.130341    0.693547    1.330529    1.933249   -0.690281    0.853833
    >>> df
                       A         B         C         D
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249
    2018-04-03 -1.075167 -0.522921  2.593055 -0.690281
    2018-04-04  0.563410  0.733652  0.526327  0.853833
    >>> df.sort_index(axis=1,ascending=False)   #.sort_index索引排序
                       D         C         B         A
    2018-03-30  1.130341 -0.192504  0.632289 -0.739980
    2018-03-31  0.693547  0.143446  0.267729 -1.622673
    2018-04-01  1.330529 -0.225253 -1.020264 -1.086053
    2018-04-02  1.933249 -0.604576 -1.153898  0.751340
    2018-04-03 -0.690281  2.593055 -0.522921 -1.075167
    2018-04-04  0.853833  0.526327  0.733652  0.563410
    >>> df.sort_index(axis=1,ascending=True)
                       A         B         C         D
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249
    2018-04-03 -1.075167 -0.522921  2.593055 -0.690281
    2018-04-04  0.563410  0.733652  0.526327  0.853833
    >>> df.sort_index(axis=0,ascending=False)
                       A         B         C         D
    2018-04-04  0.563410  0.733652  0.526327  0.853833
    2018-04-03 -1.075167 -0.522921  2.593055 -0.690281
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    >>> df.sort_values(by='A')  #对A列进行排序
                       A         B         C         D
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    2018-04-03 -1.075167 -0.522921  2.593055 -0.690281
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    2018-04-04  0.563410  0.733652  0.526327  0.853833
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249

    #选择 Selection

    >>> df['A']   /df.A   #提取A列
    2018-03-30   -0.739980
    2018-03-31   -1.622673
    2018-04-01   -1.086053
    2018-04-02    0.751340
    2018-04-03   -1.075167
    2018-04-04    0.563410
    Freq: D, Name: A, dtype: float64
    >>> df[0:3]  #提取0-2列
                       A         B         C         D
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    
    >>> df['2018-03-30':'2018-04-02']  #根据条件进行选取
                       A         B         C         D
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249
    
    #根据标签进行选择
    >>> df.loc[dates[0]]      #提取第一行数据,将List作为索引,去除index
    A   -0.739980
    B    0.632289
    C   -0.192504
    D    1.130341
    Name: 2018-03-30 00:00:00, dtype: float64
    >>> df.loc[:,['A','B']]  #提取A,B列数据
                       A         B
    2018-03-30 -0.739980  0.632289
    2018-03-31 -1.622673  0.267729
    2018-04-01 -1.086053 -1.020264
    2018-04-02  0.751340 -1.153898
    2018-04-03 -1.075167 -0.522921
    2018-04-04  0.563410  0.733652
    
    >>> df.loc['20180330':'20180402']     #=df['2018-03-30':'2018-04-02'] 
                       A         B         C         D
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249
    >>> df.loc['20180330',['A','C']]    #提取20180330行的A,C数据
    A   -0.739980
    C   -0.192504
    Name: 2018-03-30 00:00:00, dtype: float64
    >>> df.loc[dates[0],'A']    #提取第一行的A数据 ==.at
    -0.73998009901277373
    >>> df.at[dates[0],'A']
    -0.73998009901277373
    
    #根据位置获取 LOC通过标签'20180330','A'获取数据,iloc通过行号0-5,列号0-4进行获取
    >>> df.iloc[3]   #获取第四行数据
    A    0.751340
    B   -1.153898
    C   -0.604576
    D    1.933249
    Name: 2018-04-02 00:00:00, dtype: float64
    >>> df.iloc[3:5,0:2]   #获取第4,5行,第1,2列数据
                       A         B
    2018-04-02  0.751340 -1.153898
    2018-04-03 -1.075167 -0.522921
    >>> df.iloc[[1,2,3],[0,2]]
                       A         C
    2018-03-31 -1.622673  0.143446
    2018-04-01 -1.086053 -0.225253
    2018-04-02  0.751340 -0.604576
    >>> df.iloc[1:3,:]
                       A         B         C         D
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    >>> df.iloc[:,1:3]
                       B         C
    2018-03-30  0.632289 -0.192504
    2018-03-31  0.267729  0.143446
    2018-04-01 -1.020264 -0.225253
    2018-04-02 -1.153898 -0.604576
    2018-04-03 -0.522921  2.593055
    2018-04-04  0.733652  0.526327
    >>> df.iloc[1,2]  #快速获取一个值    ==.iat
    0.14344580950869434
    >>> df.iat[1,2]
    0.14344580950869434

    #布尔索引
    利用一列的数据选择一部分数据

    >>> df
                       A         B         C         D
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341
    2018-03-31 -1.622673  0.267729  0.143446  0.693547
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249
    2018-04-03 -1.075167 -0.522921  2.593055 -0.690281
    2018-04-04  0.563410  0.733652  0.526327  0.853833
    
    >>> df[df.A>0]    #获取df.A>0的行
                      A         B         C         D
    2018-04-02  0.75134 -1.153898 -0.604576  1.933249
    2018-04-04  0.56341  0.733652  0.526327  0.853833
    >>> df[df>0]      #获取全部>0的值,小于0的数据使用NaN代替
                      A         B         C         D
    2018-03-30      NaN  0.632289       NaN  1.130341
    2018-03-31      NaN  0.267729  0.143446  0.693547
    2018-04-01      NaN       NaN       NaN  1.330529
    2018-04-02  0.75134       NaN       NaN  1.933249
    2018-04-03      NaN       NaN  2.593055       NaN
    2018-04-04  0.56341  0.733652  0.526327  0.853833
    >>> df3=df.copy()
    >>> df3['E']= ['one','ine','two','three','four','tw1'] #添加新的列:==字典添加
    >>> df3
                       A         B         C         D      E
    2018-03-30 -0.739980  0.632289 -0.192504  1.130341    one
    2018-03-31 -1.622673  0.267729  0.143446  0.693547    ine
    2018-04-01 -1.086053 -1.020264 -0.225253  1.330529    two
    2018-04-02  0.751340 -1.153898 -0.604576  1.933249  three
    2018-04-03 -1.075167 -0.522921  2.593055 -0.690281   four
    2018-04-04  0.563410  0.733652  0.526327  0.853833    tw1
    '''
    s1 = pd.Series([1,2,3,4,5,6],index=pd.date_range('20180330',periods=6))
    '''
    >>> df['F']=s1
    >>> df
                       A         B         C         D  F
    2018-03-30 -1.211269 -0.230951  0.043337 -0.009419  1
    2018-03-31  0.777628 -1.073505 -0.020837 -1.536191  2
    2018-04-01 -0.796874  0.683661 -0.674022  1.692808  3
    2018-04-02  0.175397 -0.388439  0.282642 -0.896609  4
    2018-04-03 -0.465964 -0.763797 -0.816209  0.062528  5
    2018-04-04  0.967350 -1.416464 -0.547718 -0.034147  6
    
    >>> s1
    2013-03-30    1
    2013-03-31    2
    2013-04-01    3
    2013-04-02    4
    2013-04-03    5
    2013-04-04    6
    Freq: D, dtype: int64
    >>> df['F']=s1      #插入的时候,需要使index保持一致
    >>> df
                       A         B         C         D   F
    2018-03-30 -0.031562  1.484402  1.793304  0.853730 NaN
    2018-03-31  0.281454  0.121194 -0.141079  0.739159 NaN
    2018-04-01  1.920370  0.637906  0.786430  0.344235 NaN
    2018-04-02  1.558576 -1.547453 -2.212035 -0.853297 NaN
    2018-04-03  1.603768 -0.273412 -1.106593 -0.597859 NaN
    2018-04-04 -1.745511  1.979249 -0.015600  0.991435 NaN
    
    >>> df.at[dates[0],'A'] = 0   #at使用标签赋值
    >>> df
                       A         B         C         D  F
    2018-03-30  0.000000 -0.230951  0.043337 -0.009419  1
    2018-03-31  0.777628 -1.073505 -0.020837 -1.536191  2
    2018-04-01 -0.796874  0.683661 -0.674022  1.692808  3
    2018-04-02  0.175397 -0.388439  0.282642 -0.896609  4
    2018-04-03 -0.465964 -0.763797 -0.816209  0.062528  5
    2018-04-04  0.967350 -1.416464 -0.547718 -0.034147  6
    >>> df.iat[0,0] =1  #iat使用坐标进行赋值
    >>> df
                       A         B         C         D  F
    2018-03-30  1.000000 -0.230951  0.043337 -0.009419  1
    2018-03-31  0.777628 -1.073505 -0.020837 -1.536191  2
    2018-04-01 -0.796874  0.683661 -0.674022  1.692808  3
    2018-04-02  0.175397 -0.388439  0.282642 -0.896609  4
    2018-04-03 -0.465964 -0.763797 -0.816209  0.062528  5
    2018-04-04  0.967350 -1.416464 -0.547718 -0.034147  6
    >>> df.loc[:,'D']= np.array([5]*len(df))    #使用np进行赋值
    >>> df
                       A         B         C  D  F
    2018-03-30  1.000000 -0.230951  0.043337  5  1
    2018-03-31  0.777628 -1.073505 -0.020837  5  2
    2018-04-01 -0.796874  0.683661 -0.674022  5  3
    2018-04-02  0.175397 -0.388439  0.282642  5  4
    2018-04-03 -0.465964 -0.763797 -0.816209  5  5
    2018-04-04  0.967350 -1.416464 -0.547718  5  6
    
    >>> -df
                       A         B         C    D    F
    2018-03-30 -1.000000  0.230951 -0.043337 -5.0 -1.0
    2018-03-31 -0.777628  1.073505  0.020837 -5.0 -2.0
    2018-04-01  0.796874 -0.683661  0.674022 -5.0 -3.0
    2018-04-02 -0.175397  0.388439 -0.282642 -5.0 -4.0
    2018-04-03  0.465964  0.763797  0.816209 -5.0 -5.0
    2018-04-04 -0.967350  1.416464  0.547718 -5.0 -6.0
    >>> df4 = df.copy()
    >>> df4[df4>0] = -df4    #将df4数据全部变负值
    >>> df4
                       A         B         C  D  F
    2018-03-30 -1.000000 -0.230951 -0.043337 -5 -1
    2018-03-31 -0.777628 -1.073505 -0.020837 -5 -2
    2018-04-01 -0.796874 -0.683661 -0.674022 -5 -3
    2018-04-02 -0.175397 -0.388439 -0.282642 -5 -4
    2018-04-03 -0.465964 -0.763797 -0.816209 -5 -5
    2018-04-04 -0.967350 -1.416464 -0.547718 -5 -6
    
    '''
    #df.to_csv('123.txt') #会自己创建文件,如果文件存在,则覆盖
    #df.to_excel('345.xlsx')
    print('写入成功')
    df5 = pd.read_csv('123.txt')
    df6 = pd.read_excel('345.xlsx')
    print(df6)
     
  • 相关阅读:
    四层架构设计实践
    看看node.js chat程序如何实现Ajax longpolling长链接刷新模式
    模仿igoogle【定制化、拖动排序,最大化、分屏】
    安装和配置Apache
    好书推荐《Pro ASP.NET MVC 3 Framework 3rd Edition》
    GAC和VS引用的程序集不一致?
    不要在 ASP.NET 4.5 Beta 的 Page 类事件上直接使用 async 与 await
    使用事务自动回滚来实现单元测试
    C# 如何异步查询数据库
    Linq + Jquery + Ajax 实现异步分页,批量删除,单个删除,全选,反选 ……
  • 原文地址:https://www.cnblogs.com/eilinge/p/9844943.html
Copyright © 2011-2022 走看看