美文网首页biostatistics我爱编程
pandas数据分析进阶笔记(三):pandas

pandas数据分析进阶笔记(三):pandas

作者: 井底蛙蛙呱呱呱 | 来源:发表于2017-05-11 19:08 被阅读304次

    (一)pandas基础

    常用的两种数据结构:Series,DataFrame.

    鉴于Series可根据index取得values,可通过字典来创建Series。

    isnull和notnull用于检测确实数据。

    布尔型索引,层次化索引(重新分级排序),重新索引(reindex(),参数:index, method, fill_value, limit, level, copy)

    drop(),丢弃指定轴上的项,即丢弃行或列,有个axis参数制定行(axis=0)还是列(axis=1).

    利用ix对指定的行,列标签进行索引,如data.ix(行标签,列标签),非常好用的索引方法。

    sort-index(),接受一个axis参数,对行或列标签进行排序,若要对列的值进行排序,可使用by参数。

    data.describe() 用于一次产生多个汇总统计。
    value_counts() 返回一个Series,其索引为唯一值,按发现的顺序返回。
    unique计算Series中的唯一值数组,按发现的顺序返回。

    缺失数据处理方法:
    dropna() 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过调节阀值调整对缺失值的容忍度。
    fillna() 填充缺失数据,参数:value,method,axis,inplace,limit。

    (二)pandas数据读取

    pd.read_csv() 加载带分隔符的数据,默认分隔符为逗号
    pd.read_table() 也是加载带分隔符的数据,默认分隔符为制表符("\t")
    read_fwf() 读取定宽列格式数据(也即无分隔符)

    数据保存。
    json.loads() 将Json字符串转换为python格式
    json.dumps() 将python对象转换为Json格式
    Pytables和h5py 高速读写,适用于大量数据,密集IO型

    pd.read_csv()/pd.read_table()的参数:

    path   文件路径及文件名
    sep或delimiter    分隔符,支持正则
    header    用作列名的行号,默认第一行,无则设置为None
    index_col    用作行索引的列名或列编号
    names    header=None时自行设置的列名
    skiprows    忽略行数,从头算起
    skip_footer    忽略行数,从文件尾算起
    nrows      读取的行数
    iterator    返回一个TextParser以便逐块读取
    chunksize    文件块的大小(用于迭代)
    

    (三)数据规整化:清理,转换,合并,重塑

    pd.merge()参数:

    left,right      参与合并的左右的DataFrame
    how        inner,outer,left,right之一,默认为inner,即取交集,outer取并集
    on        用于连接的列名。默认以两个DataFrame的交集作为连接键
    left_on,right_on    左右DataFrame中用作连接键的列
    left_index,right_index        将左/右侧行索引作为连接键
    sort      根据连接键对合并后的数据进行排序,默认为True。处理大数据时禁用以获得更好的性能
    suffixes      字符串元组,用于追加到重叠列名的末尾,默认为('_x','_y').
    copy        设置为False可以在某些特殊情况下避免将数据复制到结果数据结构中,默认为True
    

    join方法能更为方便地实现按索引合并。

    轴向连接,pd.concat(),参数:

    objs      参与连接的pandas对象的列表或字典,唯一必需的参数,如[df1,df2]
    axis      连接的轴向,默认为o(行)
    join      inner,outer之一,指明合并方式:交集还是并集
    join_axes    指明用于其他n-1条轴的索引,不执行交/并集运算
    keys      与连接对象有关的值,用于形成连接轴向上的层次化索引
    levels      指定用作层次化索引个级别上的索引,若设置了keys的话
    names    设置分层索引的名称,前提时设置了keys或者values
    verify_integrity      检查结果对象新轴上的重复情况,若有则异常,默认False允许重复
    ignore_index        不保留连接轴上的索引,产生一组新的索引
    

    combine_first(),为含有重叠索引的机组数据互相打补丁,也即互补填充NaN值。

    重塑层次化索引.
    stack 将数据的列'旋转'为行
    unstack 将数据的行'旋转'为列
    pivot()可达到类似的效果。

    移除重复数据
    duplicated() 返回一个布尔型Series判断每一行是否重复
    drop_duplicates( ) 移除重复行,也可移除指定重复列,可考虑先排序再消去重复

    map()可用来添加或转换某列或与某列有对应关系的列
    replace()直接对DataFrame中的特定值进行替换
    rename()转换轴标签,不改变原数据,若inplace=True,则改变原数据
    cut()划分样本所属区间,将其分为几类
    qcut()将样本划分为几个区间,每个区间内样本数相等

    get_dummies() 可用于机器学习的数据处理,将各个特征分类变成0,1

    (四)matplotlib API入门

    (1)创建Figure,fig=plt.figure()。plt.gcf()可得到当前Figure的引用。
    (2)在Figure中绘图时先加入一个活多个subplot才行。ax1=fig.add_subplot(2,2,1)
    (3)在ax1中绘图,plt.plot(np.random.randn(50).cumsum(), 'k--')
    (4)设置坐标轴范围,ax1=set_xlim(a,b), ax1.set_ylim(m,n)
    (5)设置坐标轴刻度,ax1.set_xticks(....), ax1.set_yticks(....)。也可设置其他值(如字符串)作为刻度,如
    ax1.set_xtickslables(*strings)
    (6)设置x,y轴名称,ax1.set_xlable('x'); ax1.set_ylable('y')
    (7)设置图片标题,ax1.set_title('hello world')
    (8)设置图例,一般在绘图时加入,如plt.plot(np.random.randn(50.cumsum()), 'k--', lable='apple'),后面的lable参数即为图例。最后调用ax1.legend(loc="best")或plt.legend(loc="best")来显示图例。
    (9)添加注释(如文本、箭头等)。添加文本ax1.text(x,y,'hello',fontsize=10),(x,y)为添加文本的位置,"hello"为添加文本的内容。
    (10)保存。plt.savefig("figpath.png"),参数:

    fname    含文件路径的字符串或python的文件型对象,图片格式有文件扩展名推断出,如png,pdf等
    dpi        图片分辨率,默认为100
    facecolor,edgecolor    图像背景色,默认白色
    farmat    直接设置图片格式,如JPG,pdf等
    bbox_inches    图像需保存的部分,若设置为"tight",则尽可能剪除图像周围空白部分。
    

    (五)pandas中的绘图函数回执的matplotlib

    Series.plot()方法,也可在DataFrame中使用,参数:

    label    用于图例的标签
    ax    要在其上进行绘制的matplotlib subplot对象,若未设置,则使用当前matplotlib subplot
    style    传给matplotlib的画图风格字符串,如"ko--"
    alpha    图像的填充不透明度(0-1)
    kind    图的类型,可以是"line","bar","barh"(水平柱状图),"kde"(密度图)
    logy    在y轴上使用对数标尺
    use_index    将对象的索引用作刻度标签
    rot    旋转刻度标签
    xticks,yticks    用作x/y刻度的值
    xlim, ylim    x/y轴的界限
    grid      显示轴网格线,默认打开
    

    专用于DataFrame的plot参数:

    subplots      将各个DataFrame列绘制到单独的subplot中
    sharex,sharey      若subplots为True,则共用一个x/y轴
    figsize      表示图像大小的元组
    title      图像标题
    legend     添加一个subplot图例,默认为True
    sort_columns      以字母表顺序绘制各列,默认使用当前列顺序
    

    (1)柱状图 kind='bar'或kind='barh'(水平柱状图)。设置stacked=True可生成堆叠状柱状图(各行堆在一起)。
    归一化。
    (2)直方图与密度图
    (3)散点图

    (六)数据聚合与分组运算

    image.png

    GroupBy技术 split-apply-combine 拆分-应用-合并
    一般用法:df.groupby('key1')['data1'] <==> df['data1'].groupby(df['key1'])

    有时候根据层次化索引分组是个不错的选择,传入level参数,如df.groupby(level='city', axis=1).count()

    groupby()可根据行列标签以及函数来进行分组。
    经过优化的groupby方法:

    count    分组中非NA值的数量
    sum    非NA值的和
    mean  ...平均值
    median   ...中位数
    std,var    无偏(分母为n-1)标准差和方差
    min,max      ...最大值和最小值
    prod      非NA值的积
    first,last      第一个,最后一个非NA值
    
    #栗子
    import numpy as np
    import pandas as pd
    
    df1 = pd.DataFrame(np.arange(12).reshape((3,4)), columns=['chr','pos','a','b']
    df = pd.concat([df1,df1])
    #df
       chr  pos   a   b
    0    0    1   2   3
    1    4    5   6   7
    2    8    9  10  11
    0    0    1   2   3
    1    4    5   6   7
    2    8    9  10  11
    
    df.groupby(['chr','pos']).sum()
              a   b
    chr pos
    0   1     2   3
    4   5     6   7
    8   9    10  11 
    

    groupby对象也可通过agg()方法对特定列使用自定义统计方法。

    transform(向量化运算),将一个函数应用到各个分组,然后将结果放置到适当的位置上。
    跟agg一样,transform也是一个有着严格条件的特殊函数:传入的函数只能产生两种结果,要么产生一个可以广播的标量值(如np.mean),要么产生一个相同大小的结果数组。

    apply,最一般的groupby方法。apply会将待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将各个片段组合到一起。例子:

    import pandas as pd
    
    df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'], 'key2': ['one', 'two', 'one', 'two', 'one'], 
                       'data1': np.random.randn(5), 'data2': np.random.randn(5)})
    
    def f(df, col=1):
        return df[df['data2'] == max(df['data2'])]  
    
    df1 = df.groupby(['key1']).apply(f)   #使用key1作为分组元素进行分组并使用data2筛选数据,留下每个组中data2最大的
    
    print(df)
    print(df1)
    #输出
          data1     data2 key1 key2
    0 -0.407953 -0.506048    a  one
    1 -1.282764  0.575502    a  two
    2  0.697294  1.183693    b  one
    3 -1.699044  0.090585    b  two
    4  1.144997  0.224858    a  one
               data1     data2 key1 key2
    key1                                
    a    1 -1.282764  0.575502    a  two
    b    2  0.697294  1.183693    b  one
    [Finished in 2.7s]
    
    

    透视表,pivot_table方法,参数:

    values    待聚合的列的名称,默认聚合所有数值列
    rows      用于分组的列名或其他分组键,出现在结果透视表的行
    cols    用于分组的列名或其他分组键,出现在结果透视表的列
    aggfunc    聚合函数或函数列表,默认为mean,可以是任何对groupby对象有效的函数
    fill_value    用于替换结果表中的缺失值
    margins    添加行/列小计的总计,默认为False
    

    交叉表,crosstab。

    相关文章

      网友评论

        本文标题:pandas数据分析进阶笔记(三):pandas

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