zoukankan      html  css  js  c++  java
  • pandas入门

    pandas当中最重要的部分就是pandas提供的dataframe和series类型,可以用来保存任何形式的数据,保存之后的结果类似于二维表的形式

    Series

    series有两个重要的参数是values和index

    In [76]: obj = pd.Series([4,5,6,7])
    
    In [77]: obj
    Out[77]:
    0    4
    1    5
    2    6
    3    7
    dtype: int64
    
    In [78]: obj.index
    Out[78]: RangeIndex(start=0, stop=4, step=1)
    
    In [79]: obj.values
    Out[79]: array([4, 5, 6, 7], dtype=int64)
    

    Series本身和索引都有一个index属性,pandas有一个重要特征就是其iloc选择时是后包含的,比如df[:4,1]是指的0,1,2,3,4行的第1列

    In [81]: obj.name = 'population'
    
    In [82]: obj.index.name = 'state'
    
    In [83]: obj
    Out[83]:
    state
    0    4
    1    5
    2    6
    3    7
    Name: population, dtype: int64
    

    DataFrame

    DataFrame是一个表格型数据结构,同时有行索引和列索引,列的索引被称为columns,行索引被称为index

    DataFrame的值仍然存储在values属性里面

    更换列的顺序只需要在创建dataframe的时候指定columns的值

    其columns和index也可以分别指定名字

    index

    index对象是不可更改的

    reindex方法可以改变原先index的顺序,不过值也会跟着变,相当于换行的顺序,其中的columns参数可以重新索引列,其中的method可以指定对于不存在的index的插值方法,ffill或pad表示向前填充,bfill和backfill表示向后填充

    drop

    drop用于删除某些行或某些列,删除index行的时候只需要传入index,删除列的时候要传入columns的名字和axis=1

    applymap和apply

    apply可以应用函数到dataframe上,applymap可以应用函数到元素集级别上

    In [8]: df = pd.DataFrame(np.arange(0,1,0.1).reshape(2,5))
    
    In [9]: df
    Out[9]:
         0    1    2    3    4
    0  0.0  0.1  0.2  0.3  0.4
    1  0.5  0.6  0.7  0.8  0.9
    
    In [12]: df.applymap(format)
    Out[12]:
              0         1         2         3         4
    0  0.000000  0.100000  0.200000  0.300000  0.400000
    1  0.500000  0.600000  0.700000  0.800000  0.900000
    

    排序

    1. sort_index:按照索引排序,传入axis=1则按columns进行排序,传入by参数则按照某列的值进行排序
    2. order:对Series进行排序

    描述和汇总统计

    方法 说明
    count 非NA的值的数量
    decribe 统计性描述,包括max,min,mena等
    max,min 最大最小值
    argmax, argmin 获取到最大最小值的索引位置(整数)
    quantile 计算样本的分位数
    sum 总和
    median 中位数
    mad 平均绝对离差
    var、std 方差、标准差
    skew 三阶矩(样本的偏度)
    kurt 四阶矩(样本的峰度)
    cumsum 累积和
    cummin,cummax 样本的累计最大值和累积最小值
    cumprod(cum表示cumulative累积的,prod表示product乘积) 样本的累计积
    diff 一阶差分
    pct_change 计算百分数变化(比如股票涨跌计算)

    初始化一个dataFrame,可以read_csv从csv文件获取,也可以通过如下代码:

    import pandas as pd
    df = pd.DataFrame(data, index, columns)
    

    其中data是numpy中提供的数组或者是字典,index表示每行最左边用于索引的列,columns表示每一列的名称

    要取出DataFrame的值,只需要df.column_name,用.加上列的名字就可以了

    查看数据

    通过

    1. df.head:查看前五行数据,
    2. df.columns:查看列名
    3. df.values:查看矩阵的值
    4. df.describe():查看矩阵的统计描述,包括值的个数,平均值,标准差,最大最小值等等
    5. df.T:转置矩阵
    6. df.sort_index(axis=1, ascending=False):通过列的大小值比较进行排序,axis=0时按照行的大小值进行排序
    7. df.sort_values(by='B')
    8. df.A或者df['A']:选取某一列的值
    9. df[0:3]:通过行号选取某几行的值
    10. df['20101010':'20101030']:通过索引选取某些行的值
    11. df.loc[data[0]]:通过索引进行选取,表示的是loc
    12. df.iloc[1:3,1:4]:通过位置进行选取
    13. df.iloc[[1,3,4],[0,2]]:通过位置跳跃式选取,表示的是int loc,通过正数进行索引
    14. df[df.A > 0]:条件选择

    处理丢失数据

    首先复制并修改一下df的索引和columns

    df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])

    这样因为第E列是没有赋值的所以全部为NAN

    对于nan数据的处理有两种方法,分别是dropnafillna

    1. df1.dropnan(how='any'):删除所有值为nan的行
    2. df1.fillnan(value=5):将所有nan的值填充为5,可以用字典的形式指定每一列的填充值

    查找所有的nan,pd.isnull(df1)或者是pd.notnull(df)

    对数据进行统计操作

    1. df.mean():默认求取的是每列的值,得到一个行向量
    2. df.mean(1):按行求平均值,得到一个列向量
    3. df.apply(lambda:x:x.max()-x.min()):apply应用一个函数到

    DataFrame拼接

    增加行:append,增加列:assign,df.assign(age=[1,2,3])

    将list连接成DataFrame或者增加列,concat,参数为axes,指定按行合并还是按列合并;参数key,按行合并时可以建立层次化索引,按列合并时作为列的名称。ignore_index=true,可以让合并之后的index是行号而没有重复。

    df = pd.DataFrame(np.random.randn(10, 4))
    pieces = [df[:3], df[3:7], df[7:]]
    pd.concat(pieces)
    

    将两个DataFrame按值连接在一起(数据库风格的合并),merge,参数为on,表示按那一列进行合并,默认的how参数为Inner,即内连接,如果要保留所有的值,可以将how设置为outer(外连接时等同于join)

    left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
    right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
    In [79]: left
    Out[79]: 
       key  lval
    0  foo     1
    1  foo     2
    In [80]: right
    Out[80]: 
       key  rval
    0  foo     4
    1  foo     5
    In [81]: pd.merge(left, right, on='key')
    Out[81]: 
       key  lval  rval
    0  foo     1     4
    1  foo     1     5
    2  foo     2     4
    3  foo     2     5
    

    将两个DataFrame按行连接在一起,Append

    df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
    s = df.iloc[3]
    df.append(s, ignore_index=True)
    

    按条件分组,groupby

    df.groupby('A').sum()
    

    对数据进行分类

     df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})
     df["grade"] = df["raw_grade"].astype("category")
    

    对分类重命名:Series.cat.categories

    df["grade"].cat.categories = ["very good", "good", "very bad"]
    

    正则表达式条件判定

    operating_system = np.where(cframe['a'].str.contains('Windows'),'Windows','Not Windows')
    

    这里用np.whereDataFrame.str.contains('')来进行判定一个字符串是否包含windows,如果包含则将其改为windows,否则将其改为'not windows'

    数据规整

    stack和unstack

    stack:将行旋转为列

    unstack:将列旋转为行,默认进行的是最内层的一列

    >>> data=DataFrame(np.arange(6).reshape((2,3)),index=['ohio','colorado'],columns=['one','two','three'])
    >>> data
              one  two  three
    ohio        0    1      2
    colorado    3    4      5
    >>> data.index.name='state'
    >>> data.columns.name='number'
    >>> data
    number    one  two  three
    state                    
    ohio        0    1      2
    colorado    3    4      5
    >>> data.stack()
    state     number
    ohio      one       0
              two       1
              three     2
    colorado  one       3
              two       4
              three     5
    #将列转化为行,得到一个Series
    #对于一个层次化索引的Series,可以用unstack将其重排为一个DataFrame
    
    result.unstack(0)
    state   ohio  colorado
    number                
    one        0         3
    two        1         4
    three      2         5
    >>> result.unstack('state')
    state   ohio  colorado
    number                
    one        0         3
    two        1         4
    three      2         5
    

    pivot_table:数据透视表

    比如在电影打分里面,想得到男女对不同电影的打分,可以使用以下的函数

    mean_ratings = data.pivot_table('rating', index='title', columns='gender', aggfunc='mean')
    

    数据类型转换

    df.astype(int):将所有数据转换为int类型

    数据排序

    argsort:直接将值改为排序后的标号

    Africa/Cairo                      20
    Africa/Casablanca                 21
    Africa/Ceuta                      92
    Africa/Johannesburg               87
    Africa/Lusaka                     53
    # 右边得出的是他们经过排序之后的序号
    

    通过take函数可以取出以argsort为index的数据

    将多个文件里面的数据连接在一起

    用一个循环,每次用read_csv或者是read_table函数读出一个dataframe,然后append到一个空list里面,最后通过pd.concat(frame,ignore_index=True)连接成一个大的dataframe

    years = range(1880,2011)
    frame = []
    for year in years:
        filename = 'yob{}.txt'.format(year)
        df = pd.read_csv(filename,names=['name','sex','births'])
        frame.append(df)
    data = pd.concat(frame,ignore_index=True)
    data.to_csv('birth_data.csv')
    

    多列索引重新排序

    swaplevel:交换索引
    sortlevel:索引排序

    set_index:和stack很像,将列值变成索引

    reset_index:和unstack很像,将多级索引编程列值

    数据读入

    读入方法

    1. read_csv:用于读取csv,默认分隔符为逗号,需要修改默认分隔符用seperator参数,指定列名用header,无列名时用header=None,无index用index=None
    2. read_table:读取txt文件,默认分隔符' ',如果分隔符不止一个 的空格,那么用seperator='s+'
    3. read_fwf:fixed-width file,读取定宽文件,也就是没有分隔符
    4. read_clipboard:读取剪贴板中的数据,在将网页转换为表格时很有用
    • 如果只想读入前n行,可以使用nrows参数,指定读入的行数

    读入json的方法:

    import json
    #将json读入为python对象-字典
    result = json.loads(obj)
    #将python对象转化为json
    asjson = json.dumps(result)
    

    将长格式转换为宽格式

    pivot函数:第一个参数表示行索引的列,第二个参数表示列索引的列

    移除重复数据

    duplicated():返回一个布尔型变量

    drop_duplicates:移除重复行的DataFrame,默认保留第一个出现的值,如果要保存最后一个应该传入take_last=True

    对某列传入一个函数

    map

    重命名轴索引

    rename:得到原始的轴索引的转换版(比如首字母大写或者是全大写)

    data.rename(index=str.title,columns=str.upper)
    

    值分区

    pd.cut(data, [0, 5, 15, 20], right=False):将数据按照[0,5),[5,15),[15,20)进行划分

    pd.qcut(data,4)将数据按分位数等分为4份

    随机重排

    np.random.permutation(x):若x是一个整数,那么返回打乱的np.arange(x),然后通过df.take随机选出这若干行;若x是一个数组,那么返回一个打乱的数组的copy

    r = np.random.permutation(len(df))[:5]
    df_r = df.take(r)
    

    计算哑变量

    get_dummies

    Series字符串处理

    series.str.xxx

    其中包含了一大堆字符串处理函数,比如:contains,findall

    也可以使用map和正则表达式来完成

  • 相关阅读:
    py-day1-2 python的循环语句
    B/S和C/S结构的区别
    php get_magic_quotes_gpc() addslashes()
    SqlHelper数据库访问类
    随滚动条滚动的居中div
    有关Repeater的事件
    Repeater的ItemCommand事件和ItemCreated事件,高手请跳过~
    温故而知新之数据库的分离和附加…高手请跳过….
    自己做的一个小功能~
    php什么是变量的数据类型
  • 原文地址:https://www.cnblogs.com/drawon/p/8520721.html
Copyright © 2011-2022 走看看