zoukankan      html  css  js  c++  java
  • Python pandas & numpy 笔记

    记性不好,多记录些常用的东西,真·持续更新中::
    先列出一些常用的网址:

    习惯上我们如此导入:

    import pandas as pd
    import numpy as np
    import maplotlib.pyplot as plt
    

    pandas 篇

    pd.Series是一种一维的数组结构,可以列表形式初始化,得到的Series的index默认∈[0,n)

    s = pd.Series([1, 3, 5, np.nan, 6, 8])
    

    pandas的index、columns用list初始化,具体内容用矩阵初始化DataFrame:

    pd.date_range('20160101',periods=6)
    df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
    
    dates = pd.date_range('20190101', periods=6)
    df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
    
    查看数据:
    # 查看前n行 后n行
    df.head(n)     df.tail(n)
    # 查看快速统计摘要,注意describe也是一个df
    df.describe()
    # 转置 按轴排序(0x1y),按列'B'的值排序
    df.T
    df.sort_index(axis=1, ascending=False)
    df.sort_values(by='B')
    
    选择数据
    # 选择独列 [0,3)行 [0,3)列
    df['A']    df[0:3]  df.iloc[;, [0, 1, 2]]
    # 选择A B列还可以:
    df.loc[:, ['A', 'B']]
    # 获取dates[0]行的'A'列
    df.loc[dates[0], 'A']
    # loc前面加i表示利用数字而非名称来操作,比如取第3列
    df.iloc[3]
    # 比如取[3, 5)行的[0, 2)列:
    df.iloc[3:5, 0:2]
    # 行与列的切片:
    df.iloc[1:3, :]  和 df.iloc[:, 1:3]
    # 布尔索引 A列>0者, E列元素为'two' 或者 'four' 者
    df[df.A > 0]   和 df[df['E'].isin(['two', 'four'])]
    # 利用numpy 设置一组值
    df.loc[:, 'D'] = np.array([5] * len(df))
    # 利用where对某些值进行处理,比如大于0的取反
    df[df>0] = -df
    # 缺失数据的操作
    df.dropna(how='any') 或者 df.fillna(value=5)
    # 在不同轴上进行统计,mean是均值,一样0x1y
    df.mean()   或者 df.mean(1)
    # 数据应用于数据,例如累加,或者是lamda表达式
    df.apply(np.cumsum)  或 df.apply(lambda x: x.max() - x.min())
    # 排序数据
    
    df.sort_values(by='columnsName')
    
    # 单独设置某一列的属性
    
    df[['ISP']] = df[['ISP']].astype(int)
    
    合并操作
    # 如果是df组成的List,直接可以concat
    pieces = [df1, df2, df3]
    # ig..index 决定是否要重置index
    pd.concat(pieces, ignore_index=True),注意要列同质
    # SQL风格的merge 类似于Join连接
    pd.merge(left, right, on='key')
    # 尾随hh 是往后面添加,用appen,注意参数ignore_index=True才会重排index
    df1.append(df2, ignore_index=True)
    
    ###### Grouping操作 和 Pivot 表
    df.groupby('A') 或者多个的话 df.groupby(['A', 'B'])
    pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
    
    处理丢失数据
    # 直接去掉nan所在的行or列,干脆利落
    df.dropna(
        axis=0, # 行0列1
        how='any' # any但凡有nan就弃,all必须全nan才弃
    )
    # 填充
    df.fillna(value=0)
    # 判断是否有缺失数据,返回一个T/F的df
    df.isnull()
    # 判断是否有NaN,有就返回True
    np.any(df.isnull()) == True
    
    数据导入导出系列
    import pandas as pd
    # 读写csv,header决定是否有colums列说明
    data = pd.read_csv('xxx.csv', header=None)
    # sep是数据分隔的标记,默认是逗号
    # index是否保留索引 默认保留
    df.to_csv('xxx.csv', index=False, header=False, sep='?')
    # 其它有用的参数有:
    # na_rep="NA" 空值替换,默认是空格
    # fload_format="%.2f" 数据保留2位小数
    # 保留某些列而已 columns=['name', 'sex']
    # 保存到pickle
    data.to_pickle('xxx.pickle')
    

    numpy 篇

    # 创建数组
    a = np.array([1,2,4])
    # 指定数据类型 dtype
    a = np.array([1,2,3]), dtype=np.float)
    # 创建初始化好的x行y列的数组,如全0,全1等
    np.zeros((x,y), dtype=np.int)  和 np.ones((x,y)), np.empty((x,y))
    # 创建连续数组arange,1到100,步长为2
    np.arange(1, 100, 2)
    # reshape改变数据形状,注意要匹配得上
    np.arange(15).reshape(3,5)
    # linspace创建线形数据 [1,100]分成50份
    np.linspace(1, 100, 50)
    
    至于运算:
    # 加减乘除都是点对点的,直接写就ok,比如
    a-b  或者 a * b等
    # 矩阵元素要乘方,用**,比如b^2
    b**2
    # 对数据进行逻辑判断,返回的是一个对应各个元素的True False组成的array
    b < 3
    # 矩阵点乘,随机矩阵,求sum min max
    a.dot(b) 或者 np.dot(a, b)
    np.random.random((2,4))
    a.sum()  或 a.min() 或 a.max
    
    Numpy array 合并
    # 假设有np.array([1,1,1])和np.array([2,2,2])
    np.vstack((A,B))  # [[1,1,1] [2,2,2]] vertival stack
    np.hstack((A,B)) $ [1,1,1,2,2,2] horizontal stack
    # array的转置,因为他不是矩阵,所以:
    print(A[np.newaxis,;]) #[[1 1 1]]
    print(A[np.newaxis,;].shape) # (1,3)
    print(A[:,np.newaxis])
    """
    [[1]
    [1]
    [1]]
    
    """
    print(A[:,np.newaxis].shape)
    # concatenate 函数会更统一一些,axis取0是成列,1成行
    C.np.concatenate((A,B,B,A), axis=0)
    D.np.concatenate((A,B,B,A), axis=1)
    
    numpy的分割
    A = np.arange(12).reshape(3,4)) # 3行4列
    np.split(A, 2, axis=1) # 2行
    np.split(A, 3, axis=3) # 3列
    np.array_split(A, 3, axis=1) # 3行,不等量分割 即不均匀
    # 方便地且对应地,有vsplit和hsplit
    # v竖h横比如vsplit等于split(..., axis=0)
    np.vsplit(A,3)
    

    画图篇

    # 随机生成1000个数据
    data = pd.Series(np.random.randn(1000),index=np.arange(1000))
    # 为了方便观看效果, 我们累加这个数据
    data.cumsum()
    # pandas 数据可以直接观看其可视化形式
    data.plot()
    plt.show()
    
    # Dataframe里,一列一条线,4条:
    data = pd.DataFrame(
        np.random.randn(1000,4),
        index=np.arange(1000),
        columns=list("ABCD"))
    data.cumsum()
    data.plot()
    plt.show()
    
    # 对于经常需要画的dataframe的其他绘图形式: 
    
    df.plot(kind='bar') # 柱状图
    
    df.plot(kind='barh') # 横柱状图
    
    df.plot(kind='bar', stacked=True) # 柱状图堆叠
    
    df.plot(kind='area') 
    
    # 如果想画的是df前10行的,行为x轴的变化:
    
    for i in len(df):
    
      df.iloc[i].plot(label=str(i))
    
    plt.legend()
    
    plt.show()
    

    具体的画图小技巧可以查这里
    pandas除了plot,还有散点图scatter,柱状图bar,直方图hist,箱线图box,密度图kde,二维填充图area等。

    说一下散点图scatter,最重要的就是指定x和y

    ax=data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class1')
    # 将之下这个 data 画在上一个 ax 上面
    data.plot.scatter(x='A',y='C',color='LightGreen',label='Class2',ax=ax)
    plt.show()
    
  • 相关阅读:
    js json和对象互相转换
    github配置和git学习
    sea.js,spm学习
    less学习-语法(二)
    less学习-浏览器端编译(一)
    grunt-mac上安装运行构建工具的总结(一)
    Advice from an Old Programmer
    scikit-FEM-例2-用Morley元在方形区域上解板弯曲问题
    scikit-FEM-例1-求解Possion边值问题
    在shell脚本中调用sqlplus 分类: H2_ORACLE 2013-06-23 13:01 1437人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/Rosebud/p/10171031.html
Copyright © 2011-2022 走看看