zoukankan      html  css  js  c++  java
  • python--Numpy and Pandas 基本语法

      博客地址:http://www.cnblogs.com/yudanqu/

      numpy和pandas是python进行数据分析的非常简洁方便的工具,话不多说,下面先简单介绍一些关于他们入门的一些知识。下面我尽量通过一些简单的代码来解释一下他们该怎么使用。以下内容并不是系统的知识体系,我只是尽可能把最基础的知识点列写一下。

    一、numpy
    1、array

    1 import numpy
    2 list_1 = [1,2,3,4]
    3 array_1 = numpy.array(list_1) # 一维数组
    4 list_2 = [4,5,6,7]
    5 array_2 = numpy.array([list_1,list_2]) # 二维数组
    1 array_2.shape # 查看数组特征,eg:2行4列
    2 array_2.size # 查看元素个数, eg:8
    3 array_2.dtype # 查看数组类型,eg:int64

    注:numpy.arange(n) #与python中的range区别是前面有个a

    1 numpy.zeros(s) # 全0矩阵,s可以为一个数也可以为一个列表,eg:[2,3]表示2*3的二维数组
    2 numpy.eye(a) # 单位矩阵,生成的是浮点数
    • 访问数组中元素:

      一维:array_1[2] 、array_1[1:4]
      二维:array_2[1][2] 、array_2[1,2] 、array_2[:1,1:4]

      其中可以根据python中列表的切片来访问数据

    2、数组与矩阵运算

    ~~数组array

    1 numpy.random.randn(10) # 十个元素的一维数组
    2 numpy.random.randint(10,size=20).reshape(4,5) # 产生20个10以内的随机整数,后面的reshape是将这些数重新写成一个4*5的二维数组
    • 数组之间维度相同可以直接进行加减乘除(除数不能为0)
    • numpy.unique(array_1) # 找到里面所有的数但不重复
    • sum:二维数组中对每一列求和 sum(array_2)
      • sum(array_2[0) 对第一行求和
      • sum(array_2[:,0] 对第一列求和
    • array_2.max() #求最大值,对某行某列求则同sum

    ~~矩阵matric

    1 numpy.mat([1,2,3],[4,5,6]) # 生成一个二维矩阵
    2 numpy.mat(array_1) # 将数组转换成矩阵

    注:矩阵之间维度相同可以直接进行加减运算,而乘除运算需要行和列交叉对应,参照线性代数中的知识。

    3、input和output:

     1 import numpy as np 
     2 f = open('x.pkl','wb')
     3 #序列化到硬盘
     4 
     5 #pickle
     6 import pickle
     7 pickle.dump(x,f) # 产生pkl文件
     8 pickle.load(f) # 提取pkl文件
     9 
    10 #numpy本身的工具
    11 numpy.save('one_array',x)
    12 numpy.load('one_array.npy')
    13 numpy.savez('two_array.npz',a=x,b=y) # 对多个进行操作,进行压缩储存
    14 c = numpy.load('two_array.npz') # 提取文件
    15 c['a'] #第一个文件
    16 c['b'] #第二个文件

    二、pandas

    1、Series

     1 import numpy as np
     2 import pandas as pd
     3 #下面是创建Series的三种方法
     4 #方法1:s1 = pd.Series([1,2,3,4]) 
     5 #方法2:s2 = pd.Series(np.arange(10)) # 通过numpy.arange创建
     6 #方法3:s3 = pd.Series({'1':1,'2':2,'3':3}) # 通过字典创建
     7 s1.values # 查看值
     8 s1.index # 查看索引
     9 s4 = pa.Series([1,2,3,4],index=['A','B','C','D']) # 设置索引
    10 s4.to_dict() # 转化成字典
    11 pd.isnull(s4) #判断其中元素是否为NaN,pd.notnull()同理

    2、DataFrame

    1 from pandas import Series,DataFrame
    2 #通过粘贴板导入dataframe
    3 df = pd.read_clipboard() # 在此之前需要你copy一个表
    4 df.columns  # 输出列名
    5 df.'列名'  # 输出列的数值(是一个Series)
    6 df_new = DataFrame(df,columns=['列名1','列名2'])
    7 s1 = pd.Series(df['列名'])  # 输出这一列,dataframe的每一列是一个series
    8 s1.indexvalues 即对series操作,或者通过s1['索引值']
    • df1.iterrows() #返回一个生成器,可以用for循环来访问
      • eg: for row in df1.iterrows():
      • print(row) #返回的数据为一个tuple
    • s1,s2,s3为3个Series,用其组成一个人dataframe:
      • df_new = pd.DataFrame([s1,s2,s3],index=['A','B','C'])
      •   # index是每个Series的名称
      •   # 初始是按横向拼接成的dataframe
      •   df1 = df1.T #转置,转置之后就和直接用dataframe生成的一样了

    三、IO操作:

    1、从粘贴板读取

    1 df1 = pd.read_clipboard()
    2 df1.to_clipboard() # 写入粘贴板

    2、CSV文件

    1 df1.to_csv('名字.csv',index=False) # false则表示不添加索引号
    2 df2 = pd.read_csv('df1.csv') # 读取CSV文件

    3、json

    1 df1.to_json() # 转化成json文件
    2 pd.read_json(df1.to_json()) # 读取json文件

    4、html

    1 df1.to_html('df1_html') # 转换成HTML文件

    5、excel

    1 df1.to_excel('df1.xlsx') # 生成Excel文件

    四、Selecting and Indexing

    1 df.head() # 返回前五行
    2 df.tail() # 返回后五行
    3 # 返回更多的内容则在括号中写出来,不写则默认为五行
    4 df.iloc[:,:] #索引切片,定位,基于index,与索引名无关
    5 df.loc[:,:] # 根据索引名来,label来过滤

    Reindex:

    ~~series

    1 s1.reindex(index=['A','B','C','D','E'],fill_value=10)
    2 # fill_value 是指当重新写的index中有原来没有的,那么他本身输出为NaN,fill值为添加到这个索引下的值
    3 # 创建一个新Series,另一种赋值的方法
    4 s2 = Series(['A','B','C','D'],index=[1,5,10])
    5 s2.reindex(index=range(15)) # 生成15个索引的Series,除了原有的其他的都是NaN
    6 s2.reindex(index=range(15),method='ffill') # 在上一步的基础上,按顺序将上一个value填充到他下面的几个中(forward fill)
    7 s1.drop('A') # 表示删除A的内容

    ~~dataframe

    1 # 创建一个5*5的,通过numpy进行reshape
    2 df1 = DataFrame(np.random.rand(25).reshape([5,5]),index=['A','B','D','E','F'],colums=['c1','c2','c3','c4','c5']) # 遗漏的index中的C,通过reindex来恢复
    3 df1.reindex(index=['A','B','C','D','E','F']) # C被恢复并把value填充为NaN
    4 # columns 同理
    5 # 当index减少时就表现出切割的现象
    6 df1.drop('A',axis=0) # axis=0,代表删除行;axis=1,代表删除列(后面遇到axis同样是这个意思)

    五、NaN

    • n = np.nan
      • type(n) 是个浮点数float
      • 与nan的运算结果均是nan

    nan in series:

    • s1.isnull otnull() 判断是否为nan
    • s1.dropna() # 删除掉value为NaN的行

    nan in dataframe:

    • 判断同series
    1 df.dropna(axis=0,how='any',thresh=None) # axis表示行和列0,1来表示,how为any时表示有Nan就删掉,为all时表示全为nan时才删掉;thresh表示一个界限,超过这个数字的nan则被删掉
    2 df.fillna(value=1) # 表示所有为nan的地方填充为1
    3 df.fillna(value={0:0,1:1,2:2,3:3}) # 表示第一列的填充1,第二列的填充2,后面同理

    注:dropna,fillna不改变原始数组

    六、多级index

    • index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']] # 1,2为一级标题,abc为二级标题,即1的series下有abc,原始series下有1,2;获取内容时,可以s1['1']['a']
    • s1[:,'a'] 返回所有一级series里的a
    • 与dataframe的转换:
      • df1 = s1.unstack()
    • 逆转换:
      • s2 = df1.unstack() # 这时一二级换了位置
      • s2 = df1.T.unstack() # 这时是和原始完全一样的

    注:dataframe的index和columns都可以转换成多级的

    七、mapping and replace

    当想在一个dataframe中加一列(columns),可以直接加df['列名']=Series([数据])
    也可以通过map:创建一个字典,字典中的键是dataframe中的columns:
    df1['新列名'] = df1['字典中的键那一列'].map(那个字典) 这个可以固定对应位置,方便改值,可以指定index来改值

    replace in series:

    1 s1.replace({1,np.nan}) # 通过字典来改值
    2 s1.replace([1,2,3],[10,20,30]) # 把123索引改成10,20,30

      作者:渔单渠

      博客地址:http://www.cnblogs.com/yudanqu/

      以上内容是我的一点点总结,希望能给有需要的朋友带来带你帮助,也希望有大神来指点指点。

    作者:渔单渠 微信搜索“小田学Python”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    Coding过程中遇到的一些bug
    Git GUI的使用
    CMD控制台下的JAVAC就是“不是内部或外部命令
    Android TextView 设置滚动条(纯xml)
    Referenced file contains errors (http://www.springframework.org/schema/aop/spring-aop-3.0.xsd). For more information, right click on the message in th
    Eclipse工具栏上android的机器人小图标不见了
    eclipse indigo 安装 Eclipse Marketplace Client
    eclipse导入android项目错误,项目名称上有红叉,但代码中无报错
    Git GUI 的使用
    Android GridView 行间距过大(一页一行)
  • 原文地址:https://www.cnblogs.com/yudanqu/p/python_numpy_pandas.html
Copyright © 2011-2022 走看看