zoukankan      html  css  js  c++  java
  • Python学习笔记(六)

    Pandas库

    Series数据结构

    pandas库的基本数据结构为Series: 一个带标签(又称索引)的一维数组

    Series 的标签类似于Hbase中的行键,可重复且可以自由转换为列值。

    Series 的一维数组类似于Hbase中的列值

    Series的一般属性见下表:

    属性说明
    dtype,dtypes 数组元素的数据类型
    shape 数组的维度
    ndim 数组轴(维度)的个数,轴的个数被称作秩
    size 数组元素的总个数
    itemsize 数组中每个元素的字节大小
    nbytes 数组总字节数
    flags 对象的内存信息
    base 数组对象在内存中基于其他对象的信息
    axes 行标签列表
    data 内存中的数据信息
    values 以ndarray的形式返回Series中的数据

    关于手动创建一个Series数据结构

    import numpy as np
    import pandas as pd
    s=pd.Series() #空的
    s=pd.Series(np.array([1,2,3])) #使用np数组构造
    s=pd.Series({'a':1,'b':2,'c':3}) #使用字典(行键:值)构造
    s=pd.Series([1,2,3]],index=['1','2','3']) #创建时指定标签(索引)名
    

    关于通过索引和标签访问数据

    • 1、通过索引或标签值获得
    • 2、通过索引或标签的list获取多个行键(list的值可以用罗列和范围)
    s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
    s[0] 		#下标为0的行
    s[[0,1]] 	#下标为0和1的行
    s[[-3:]] 	#python列表的切片语法
    
    s['b']  		#标签为b的行
    s[['b','c']] 	#标签为b 和 c的行
    s[['b':]] 		#标签'b'之后的行
    

    关于Series的切片方法

    1、直接使用访问方法切片 : []

    2、索引切片方法:iloc

    3、标签切片方法:loc

    4、head取前n行

    #iloc
    s.iloc[1:2]
    #loc
    s.loc['a':'c']
    #head
    s.head(2)
    

    关于Series的常用方法

    方法说明
    sort_values() 按照Series的值进行排序,默认是升序,设置降序:sort(ascending=False)
    value_counts() 用来计算Series里面相同数据出现的频率,生成新的Series
    max() /min() 返回Series中的最大值和最小值
    mean() 求均值
    median() 求中位数
    std() 求标准差
    isnull() 判断是否为空值
    unique() 返回数组中的唯一值

    ============================================================================

    DataFrame数据结构

    ============================================================================

    就是一个二维数组,axis0为列,axis1为行

    列标签:在Series数据结构基础上增加了列标签,另外行标签有序

    列值:可以为不同的数据类型dtype

    关于创建DataFrame

    #同时设定行列键:pd.DataFrame(dict{col:dict{row1:value1,row2:value2}})
    x=pd.Series({'row1':1,'row2':2})   #col1即为列标签
    df=pd.DataFrame({'col1':{'row1':1,'row2':2}})
    
    #筛选固定列键
    x = {'a': [1], 'b': [2], 'c': [5]}
    pd.DataFrame(x,columns=['a'])  #未指定行键,筛选列键为'a'的导入
    

    关于加载数据到DataFrame

    支持的数据源:CSV格式、EXCEL格式、HTML格式、JSON格式、SQL数据库

    dataframe = pd.read_csv(url)
    dataframe = pd.read_excel(url)
    dataframe = pd.read_html(url)
    dataframe = pd.read_json(url)
    dataframe = pd.read_sql(url)
    
    #指定格式:索引列(充当行键的列) 、时间、列键:数据类型
    df=pd.read_csv(url, 
    		index_col=['city'],		# use 'city' as index
    		parse_dates=['sale_date'],	# parse 'sale_date' as date 
    		dtype = {'zip': 'str'})		
    

    关于DataFrame的列操作

    DataFrame 以列键为axis0一维,行键为axis1二维

    #取指定列的行键和行值
    df=pd.DataFrame([{'a': 1, 'b': 2}, {'a': 3, 'b': 4, 'c': 5}])
    df['a']
    df[['a','c']]
    
    #添加列
    df['d']=[1,2] #长度必须匹配
    df['e']=pd.Series([1,2,3]) #长度不需匹配,自动截断或补NaN
    df['f']=pd.Series([1,2,3],index=[0,'0','a']) #只取index与行键匹配的值
    
    #删除列
    del df['a']
    def df['a'],df['b'] #多列删除不方便,使用drop方便
    df.pop('c')  		#返回该列的Series
    df.drop(column=['b','c'],inplace=True)		# 参数inplace:是否替换原DF
    
    df['a'][1] #二位数组取值
    

    关于DataFrame的行列键转换

    #删除当前行键列,使用指定列作为行键
    df.set_index('colName') 
    
    #当前行键列(标签/索引)转为列键,添加新的数字索引
    df.reset_index()
    

    关于DataFrame的行操作

    关于DataFrame的切片

    基本与Series的切片语法相同,需要注意的是DF是二维数组且列键不支持范围切片

    1、指定列切片

    2、iloc 所有列索引切片

    3、loc 所有列标签切片

    #df是二位数组,且axis0列键不支持范围切片
    df['a'][0:] #获取a列的所有值
    df[['a','b']][0:]  
    
    #行切片
    df.iloc[0:]
    df.loc[0:1]
    
    #行列切片
    df.loc[0:1,'a':'c']
    df.iloc[0:1,0:2]
    

    关于DataFrame的行的bool切片

    关于DataFrame的行的选择查找

    列键切片支持bool的逻辑运算符,类似于Scala的filter

    #等
    df[df['type'] == 'Condo']
    #且
    df[(df.type != 'Condo') & (df.baths <= 3)]
    #或
    df[(df.type == 'Condo') | (df.beds >= 3)]
    #非
    df[~(df.type == 'Condo')]
    
    

    关于添加行

    df=pd.DataFrame([{'a':1,'b':2,'c':3,'d':4},{'a':2,'b':4,'c':6,'d':8}])
    df.loc["newrow"]=['a','b','c','d'] #行值的长度必须匹配
    
    df.loc[len(df)]=pd.Series([8,9],index=[0,100]) #index匹配的才会追加
    df.loc[len(df)] = ??? #尾部追加
    
    df.append([{'a':3,'b':4,'c':5,'d':6}])
    df.append(pd.Series([6,7,8,9],index=['a','b','c','d'],name='n'))
    
    

    关于选取子DataFrame

    df.loc["row1":"row100","col1":"col50"]
    df.iloc[row_index1:row_index2,col_index1:col_index2]
    
    df.loc["row1":"row2"]
    df.iloc[row_index1:row_index2]
    
    

    关于遍历DataFram的列与行

    #遍历列键名
    for col in df:
    	print(col)
    	
    #遍历数据
    for index,row in df.iterrows():
    	print(index,row,sep='
    ')
    
    

    关于DataFram的Group分组操作

    • 分组并不会发生归约,而是将同一分组的归并为一个DataFrame对象存储,同时多个分组的DataFrame组成了整体的DataFrame
    df=pd.read_csv("C:/Users/HuYang/Desktop/Sacramentorealestatetransactions.csv")
    byCity = df.groupby('city')
    
    #多重分组
    byStateCity = df.groupby(['state', 'city'])
    
    #遍历每个分组,打印分组名(分组键的值)和分组内容,
     分割两个变量
    for name, group in byCity:
        print(name, group, sep="
    ")
    
    
    #通过Group名获取DataFrame对象
    goldRiver=byCity.get_group("GOLD RIVER")
    goldRiver=byStateCity.get_group(('CA', 'GOLD RIVER'))
    
    #通过Group名获取索引标签
    byCity.groups['GALT'] #返回该分组对应所有索引标签
    byStateCity.groups[('CA', 'GALT')]
    
    #获取分组大小
    byCity.size()['GALT']
    byStateCity.size()[('CA', 'GALT')]
    
    #取各个分组在每个字段上的最大值
    byCity.max()
    byCity.min()
    byCity.mean()  #各个分组在每个字段上的平均值
    byCity.sum() #各个分组在每个字段上的和
    
    #取各个分组的索引最值
    byCity.idxmax()
    byCity.idxmin()
    
    

    关于DataFrame的聚合

    #先分组
    byCity.agg(np.mean,np.min)
    
    
  • 相关阅读:
    Myeclipse 找不到Convert to maven project选项
    myeclipse中disable maven nature
    运行Maven是报错:No goals have been specified for this build
    Maven 工程错误Failure to transfer org.codehaus.plexus:plexus-io:pom:1.0,Failure to transfer org.codehaus.plexus:plexus-archiver:jar:2.0.1
    -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
    新建web工程Jdk怎么不是自己安装的, 是自带的
    AGC024B Backfront
    AGC037C Numbers on a Circle
    如何看待现在的教育?自己以后怎么做!!!!
    当局者迷
  • 原文地址:https://www.cnblogs.com/whoyoung/p/11424198.html
Copyright © 2011-2022 走看看