zoukankan      html  css  js  c++  java
  • pandas2

    1、Series
    创建的方法统一为pd.Series(data,index=)
    (1,2,3)
    Series可以通过三种形式创建:python的dict、numpy当中的ndarray(numpy中的基本数据结构)、具体某个数值。index赋值必须是list类型。
    s = pd.Series({‘a’=1,’b’=2,’d’=3},index = [‘a’,’d’,’c’,b’])
    s = pd.Series(np.random.randn(5), index = list('ABCDE')
    s=pd.Series([5,4])     s=pd.Series([5,4],index=list[‘abcd’])


    2、DataFrame
    DataFrame统一的创建形式为:pd.DataFrame(data,columns=,index=)
    (1)
    #创建日期索引序列
    dates = pd.date_range('20130101', periods=6)
    #创建Dataframe,其中 index 决定索引序列,columns 决定列名
    df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
    print df
    (2)
    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' })

    ***********************************************
    3.选择/切片
    # 选择单独的一列,返回 Serires,与 df.A 效果相当。
    df['A']
     
    # 位置切片
    df[0:3]
     
    # 索引切片
    df['20130102':'20130104']
     
    # 通过标签选择
    df.loc[dates[0]]
     
    # 对多个轴同时通过标签进行选择
    df.loc[:,['A','B']]
     
    # 获得某一个单元的数据
    df.loc[dates[0],'A']
    # 或者
    df.at[dates[0],'A'] # 速度更快的做法
     
    # 通过位置进行选择
    df.iloc[3]
     
    # 切片
    df.iloc[3:5,0:2]
     
    # 列表选择
    df.iloc[[1,2,4],[0,2]]
     
    # 获得某一个单元的数据
    df.iloc[1,1]
    # 或者
    df.iat[1,1] # 更快的做法
     
    # 布尔索引
    df[df.A > 0]
     
    # 获得大于零的项的数值
    df[df > 0]
     
    # isin 过滤
    df2[df2['E'].isin(['two','four'])]

    其中,loc表示通过行标签索引行数据       需要注意的是,dataframe的索引[1:3]是包含1,2,3的,与平时的不同。?????
          at表示  at的使用方法与loc类似,但是比loc有更快的访问数据的速度,而且只能访问单个元素,不能访问多个元素。
          iloc表示通过行号获取行数据        如果说loc是按照索引(index)的值来选取的话,
                                            那么iloc就是按照索引的位置来进行选取。iloc不关心索引的具体值是多少,只关心位置是多少,所以使用iloc时方括号中只能使用数值。
          iat表示  iat对于iloc的关系就像at对于loc的关系,是一种更快的基于索引位置的选择方法,同at一样只能访问单个元素
          ix       以上说过的几种方法都要求查询的秩在索引中,或者位置不超过长度范围,而ix允许你得到不在DataFrame索引中的数据。
    注意:
       1.data[:7][['rnd_1', 'rnd_2']]  选前6行,中括号中的这两列
         但是loc与第一种方法不同之处在于会把第5行也选择进去,而第一种方法只会选择到第4行为止。

    ***************************************************
    4.赋值
    s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
    df['F'] = s1
    df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
    df1.loc[dates[0]:dates[1],'E'] = 1

    # 删除所有带有缺省项的行
    df1.dropna(how='any')
     
    # 填充缺省项
    df1.fillna(value=5)
     
    # 获得缺省项的布尔掩码
    pd.isnull(df1)

    *******************************************************
    5.观察操作
    # 观察开头的数据
    df.head()
     
    # 观察末尾的数据
    df.tail(3)
     
    # 显示索引
    df.index
     
    # 显示列
    df.columns
     
    # 显示底层 numpy 结构
    df.values
     




    # DataFrame 的基本统计学属性预览
    df.describe()
    """
      A  B  C  D
    count 6.000000 6.000000 6.000000 6.000000 #数量
    mean 0.073711 -0.431125 -0.687758 -0.233103 #平均值
    std 0.843157 0.922818 0.779887 0.973118 #标准差
    min -0.861849 -2.104569 -1.509059 -1.135632 #最小值
    25% -0.611510 -0.600794 -1.368714 -1.076610 #正态分布 25%
    50% 0.022070 -0.228039 -0.767252 -0.386188 #正态分布 50%
    75% 0.658444 0.041933 -0.034326 0.461706 #正态分布 75%
    max 1.212112 0.567020 0.276232 1.071804 #最大值
    """
     
    # 转置
    df.T
     
    # 根据某一轴的索引进行排序
    df.sort_index(axis=1, ascending=False)
     
    # 根据某一列的数值进行排序
    df.sort_value(by=,ascending=) by表示按哪一个columns参数排序
    ??????????????????????????????????????

    ********************************************************
    7.
    查询数据的前5行或末尾5行

        student.head()
        student.tail()

    查询指定的行

        student.ix[[0,2,4,5,7]] #这里的ix索引标签函数必须是中括号[]

    查询指定的列

        student[['Name','Height','Weight']].head() #如果多个列的话,必须使用双重中括号

    也可以通过ix索引标签查询指定的列

        student.ix[:,['Name','Height','Weight']].head()

    查询指定的行和列

        student.ix[[0,2,4,5,7],['Name','Height','Weight']].head()

    以上是从行或列的角度查询数据的子集,现在我们来看看如何通过布尔索引实现数据的子集查询。
    查询所有女生的信息

        student[student['Sex']=='F']

    查询出所有12岁以上的女生信息

        student[(student['Sex']=='F') & (student['Age']>12)]

    查询出所有12岁以上的女生姓名、身高和体重

        student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]

    上面的查询逻辑其实非常的简单,需要注意的是,如果是多个条件的查询,必须在&(且)或者|(或)的两端条件用括号括起来。


    ********************************************************
    6.统计
    # 求平均值   df.mean()

    # 指定轴上的平均值    df.mean(1)

    # 不同维度的 pandas 对象也可以做运算,它会自动进行对应,shift 用来做对齐操作。s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
    改操作是把数字向下移动了两个位置

    # 对不同维度的 pandas 对象进行减法操作    df.sub(s, axis='index')
    df减s

    *******************************************************
    7.函数
    d1 = pd.Series(2*np.random.normal(size = 100)+3)
    d2 = np.random.f(2,4,size = 100)
    d3 = np.random.randint(1,100,size = 100)

    random.normal()
    random.f
    random.randint

    d1.count() #非空元素计算
    d1.min() #最小值
    d1.max() #最大值
    d1.idxmin() #最小值的位置,类似于R中的which.min函数
    d1.idxmax() #最大值的位置,类似于R中的which.max函数
    d1.quantile(0.1) #10%分位数
    d1.sum() #求和
    d1.mean() #均值
    d1.median() #中位数
    d1.mode() #众数
    d1.var() #方差
    d1.std() #标准差
    d1.mad() #平均绝对偏差
    d1.skew() #偏度
    d1.kurt() #峰度
    d1.describe() #一次性输出多个描述性统计指标


    **********************************************************

    这里自定义一个函数,将这些统计描述指标全部汇总到一起:

        def stats(x):
        return pd.Series([x.count(),x.min(),x.idxmin(),
        x.quantile(.25),x.median(),
        x.quantile(.75),x.mean(),
        x.max(),x.idxmax(),
        x.mad(),x.var(),
        x.std(),x.skew(),x.kurt()],
        index = ['Count','Min','Whicn_Min',
        'Q1','Median','Q3','Mean',
        'Max','Which_Max','Mad',
        'Var','Std','Skew','Kurt'])
        stats(d1)

    在实际的工作中,我们可能需要处理的是一系列的数值型数据框,如何将这个函数应用到数据框中的每一列呢?可以使用apply函数,这个非常类似于R中的apply的应用方法。
    将之前创建的d1,d2,d3数据构建数据框:

        df = pd.DataFrame(np.array([d1,d2,d3]).T,columns=['x1','x2','x3'])
        df.head()
        df.apply(stats)
    **************结果********************
    >>> df.apply(stats)
                       x1          x2          x3
    Count      100.000000  100.000000  100.000000
    Min         -4.127033    0.010727    3.000000
    Whicn_Min   81.000000    0.000000   76.000000
    Q1           2.040101    0.270086   25.000000
    Median       3.204555    0.867420   54.500000
    Q3           4.434788    2.932584   73.000000
    Mean         3.070225    2.027167   51.490000
    Max          7.781921   19.139449   98.000000
    Which_Max   39.000000   88.000000   96.000000
    Mad          1.511288    2.007630   24.010800
    Var          4.005609    9.366646  780.090808
    Std          2.001402    3.060498   27.930106
    Skew        -0.649478    3.042986   -0.118917
    Kurt         1.220109   11.611402   -1.211579
    >>>
    *****************************************************
    7.相关系数(corr)和协方差矩阵(cov)
    除以上的简单描述性统计之外,还提供了连续变量的相关系数(corr)和协方差矩阵(cov)的求解,这个跟R语言是一致的用法。

        df.corr()

    关于相关系数的计算可以调用pearson方法或kendell方法或spearman方法,默认使用pearson方法。

        df.corr('spearman')

    如果只想关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关心x1与其余变量的相关系数:

        df.corrwith(df['x1'])

    数值型变量间的协方差矩阵

        df.cov()

    ********************************************************
    7.自动化对齐
    由于s5中没有对应的g索引,s6中没有对应的e索引,所以数据的运算会产生两个缺失值NaN。注意,这里的算术结果就实现了两个序列索引的自动对齐,而非简单的将两个序列加总或相除。对于数据框的对齐,不仅仅是行索引的自动对齐,同时也会自动对齐列索引(变量名)

    数据框中同样有索引,而且数据框是二维数组的推广,所以其不仅有行索引,而且还存在列索引

    也就是说,只有行所以和列索引都对齐的才能运算,其他的都变为NAN

    ********************************************************
    7.函数应用

    # 累加
    df.apply(np.cumsum)

    *********************************************************
    8.直方图

    s = pd.Series(np.random.randint(0, 7, size=10))
    s.value_counts()
    """
    4 5
    6 2
    2 2
    1 1
    dtype: int64
    String Methods
    """
    ***********************************************************
    9.字符处理
    s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
    s.str.lower()
    """
    0 a
    1 b
    2 c
    3 aaba
    4 baca
    5 NaN
    6 caba
    7 dog
    8 cat
    dtype: object
    """

    *********************************************************
    10.sql数据库的增删改查
    增数据:用concat
    增列:pd.DataFrame(student2,columns=['a','b','c','d']),直接在columns中写上新增的列名就行
    删除表:del students2
    删除指定的行:student.drop([1,3,4])
    保留14岁以上的学生:student[student['Age']>14]
    删除指定的列:student.drop(['Height','Weight'],axis=1).head()    
    不论是删除行还是删除列,都可以通过drop方法实现,只需要设定好删除的轴即可,即调整drop方法中的axis参数。默认该参数为0,表示删除行观测,如果需要删除列变量,则需设置为1。
    修改数据:student.ix[student['name']=='liuchang','height']=170
    **********************************************************
    10.聚合函数
    根据性别分组,计算各组别中学生身高和体重的平均值:
    student.groupby('sex').mean()
    如果不对原始数据作限制的话,聚合函数会自动选择数值型数据进行聚合计算。如果不想对年龄计算平均值的话,就需要剔除改变量:
    student.drop('age',axis=1).groupby('sex').mean()
    groupby还可以使用多个分组变量,例如根本年龄和性别分组,计算身高与体重的平均值:
    student.groupby('sex','age').mean()
    还可以对每个分组计算多个统计量:
    student.drop('age',axis=1).groupby('sex').agg([np.mean,np.median])
    **********************************************************
    10.合并

    使用 concat() 连接 pandas 对象:相同列之间直接合并

    join 合并:不同列之间的笛卡尔积

    merge:两边做关联,相当于join:
    stu_score=pd.merge(student,score,on='name')
    注意,默认情况下,merge函数实现的是两个表之间的内连接,即返回两张表中共同部分的数据。可以通过how参数设置连接的方式,left为左连接;right为右连接;outer为外连接。
    内连接,外连接,左右连接?????????????????????
    **********************************************************
    11.删除nan:df.dropna(how='all')或者'any'
       填充nan:df.fillna(0)
       用前一个观测值填充:df.fillna(method='ffill')
       用后一个观测值填充:df.fillna(method='bfill')
       使用常量填充不同的列:df.fillna('x1':1,'x2':2,'x3':3)
       用均值或者中位数填充各自的列:先算出各个列的均值或者中位数,再用上面的方法填充
    **********************************************************
    11.追加
    在 dataframe 数据后追加行
    df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
    s = df.iloc[3]
    df.append(s, ignore_index=True)

    *************************************************************
    12.分组

    # 对单个分组应用函数,数据被分成了 bar 组与 foo 组,分别计算总和。
    df.groupby('A').sum()
     
    # 依据多个列分组会构成一个分级索引
    df.groupby(['A','B']).sum()

    *************************************************************
    13.数据透视表

    pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])

    C             bar       foo
    A     B                    
    one   A -0.435493 -2.469078
          B -1.134437  1.232294
          C  0.397694 -0.146637
    three A -1.073181       NaN
          B       NaN  2.225841
          C  0.440227       NaN
    two   A       NaN  0.023365
          B -0.048074       NaN
          C       NaN -1.031985
    *************************************************************
    数据透视表详解:

        pivot_table(data,values=None,
        index=None,
        columns=None,
        aggfunc='mean',
        fill_value=None,
        margins=False,
        dropna=True,
        margins_name='All')

        data:需要进行数据透视表操作的数据框
        values:指定需要聚合的字段
        index:指定某些原始变量作为行索引
        columns:指定哪些离散的分组变量
        aggfunc:指定相应的聚合函数
        fill_value:使用一个常数替代缺失值,默认不替换
        margins:是否进行行或列的汇总,默认不汇总
        dropna:默认所有观测为缺失的列
        margins_name:默认行汇总或列汇总的名称为'All'

    eg:
    pd.pivot_table(student,values=['height','weight'],columns=['sex'],aggfunc=[np.mean,np.median,np.std])
    pd.pivot_table(student,values=['height','weight'],columns=['sex']).unstack()
    **************************************************************
    14.时间序列
    rng = pd.date_range('1/1/2012', periods=100, freq='S')
    ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
    ts.resample('5Min', how='sum')

    ts_utc = ts.tz_localize('UTC')

    # 转换为周期
    ps = ts.to_period()
     
    # 转换为时间戳
    ps.to_timestamp()

    ************************************************************
    15.多层索引:
    data['a']      返回最外层索引为a的数据
    data['a','b']  返回最外层索引为a和b 的数据
    data[:,1]      返回最内层所有为1的所有数据

    ************************************************************
    15.分类
    df["grade"] = df["raw_grade"].astype("category")
    df["grade"]
    # 重命名分类
    df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])
     
    # 根据分类的顺序对数据进行排序

    df.sort("grade")

    上面这两个函数报错???????????
    ***************************************
    series.order()升序
    series.order(ascending=False)降序
    student.sort_values(by=[sex'','age'])
    ?????????????????????????
    ******************************************************************
    16.作图
    ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
    ts = ts.cumsum()
    ts.plot()
    ************************************************************
    17.数据IO
    # 从 csv 文件读取数据
    pd.read_csv('foo.csv')
     
    # 保存到 csv 文件
    df.to_csv('foo.csv')
     
    # 读取 excel 文件
    pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
     
    # 保存到 excel 文件
    df.to_excel('foo.xlsx', sheet_name='Sheet1')

  • 相关阅读:
    网络知识
    DXP 技巧和龙芯3A装机
    312-金胜维 P系列2.5寸 480G SATA3 SSD固态硬盘
    NVIDIA Jetson TK1 开发板
    NVIDIA Jetson™ TX1
    XILINX FPGA 开发板 XC3S250E 核心板 学习板+12模块
    AES-OZ745 OZ745 Zynq-7000 开发板与套件
    北京太速科技——海外代购
    AR/VR增强现实 虚拟现实,嵌入式解决方案探讨
    270-VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡
  • 原文地址:https://www.cnblogs.com/fengff/p/8297703.html
Copyright © 2011-2022 走看看