python每日学习13:pandas库的用法(2)

python每日学习13:pandas库的用法(2)

  • 建立索引:所有的数据框默认都已经使用从 0 开始的自然数索引,因此这里的"建立”索引指的是自定义索引

    import pandas as pd
    import numpy as np
    df = pd.DataFrame( {'varl' : 1.0, ' var2' :[1,2,3,4], 'var3' : ['test', 'python','test','hello'] , 'var4' : 'cons'} , index =[0,1,2,3])
    
    # 读入数据时建立索引
    # 使用现有的列
    df = pd.read_csv ("filename",index_col="column”)
    
    # 使用复合列
    df = pd.read_csv ("filename", index_col=[0,1..])
    
    • 指定某列为索引列

      # df.set_index(keys , list,drop = True , append = False , inplace = False  )
      # keys :被指定为索引的列名,复合索引用
      # list:格式提供
      # drop = True :建立索引后是否删除该列
      # append = False :是否在原索引基础上添加索引,默认是直接替换原索引
      # inplace = False :是否直接修改原数据框
      a_dict={'aa':3000,'bb':5000,'cc':6000}
      b_dict={'aa':120,'bb':350,'cc':670}
      df=pd.DataFrame([a_dict,b_dict])
      df
      
      # df.set_index(keys=['aa','bb'],drop=False)
      df.set_index(keys='aa',append=True,drop=False)
      
    • 将索引还原变量列

      # df.reset_index(drop = False ,inplace = False )
      # drop = False :是否将原索引直接删除
      # inplace = False :是否直接修改原数据框
      df.set_index(['aa','bb','cc'],drop=True,inplace=True)
      df
      
      # 将索引全部还原为变量
      df.reset_index ()
      
      # 是否删除 index 列
      df.reset_index (drop=True)
      
    • 引用和修改索引:注意:索引仍然是有存储格式的,注意区分数值型和字符型的引用方式引用索引(df.index)

      # 修改索引
      # 修改索引名
      # 本质上和变量列名的修改方式相同
      df = pd.DataFrame({'name':['zs','ls','ww'],'level':['vip1','vip2','pm']})
      df.index.name='sno'#增加索引名称
      df2 = pd.read_excel('stu_data.xlsx')
      df3 = df2.set_index(keys = '学号')#选择一列作为索引
      df5 = df2.set_index(keys = ['学号','性别'])# '学号' 和 '性别' 两列同时设置为索引
      
      # 修改索引值
      # 这里的修改本质上是全部替换
      df.index = ['a', 'b', 'c']
      df
      
  • 更新索引

    • reindex 则可以使用数据框中不存在的数值建立索引,并据此扩充新索引值对应的索引行列,同时进行缺失值填充操作

    • df.reindex(labels ,copy = True ,method ,pad / ffill,backfill / bfill,nearest,fill_value = np.NaN,limit = None)

      • labels :类数组结构的数值,将按此数值重建索引,非必需
      • copy = True :建立新对象而不是直接更改原 df/series 缺失数据的处理方式
      • method :针对已经排序过的索引,确定数据单元格无数据时的填充方法,非必需
      • pad / ffill:用前面的有效数值填充
      • backfill / bfill:用后面的有效数值填充
      • nearest:使用最接近的数值逬行填充
      • fill_value = np.NaN :将缺失值用什么数值替代
      • limit = None :向前/向后填充时的最大步长
      import pandas as pd
      df=pd.DataFrame({'name':['11','22','33'],'level':['v1','v2','v3']})
      
      df.reindex([0,1,3])
      df.reindex([0,1,3],method='ffill')
      df.reindex([0,1,3],fill_value='test')
      
  • Series的索引和切片

    • 索引

      data=pd.Series([3,4,2,67,5],index=list('abcde'))
      data['a']
      data[2]
      data[-1]
      
    • 切片

      data['a':'d']
      data[2:4]
      data[-3:-1]
      data[data>3]
      
    • loc函数

      # loc函数:通过行索引 "Index" 中的具体值来取行数据及根据普通索引获取。(如取"Index"为"A"的行)
      # iloc函数:通过行号来取行数据,及根据位置索引获取。
      # loc与iloc的使用
      data=pd.Series([5,3,2,5,9],index=[1,2,3,4,5])
      data.loc[1]
      data.iloc[0]
      
  • DataFrame的索引和切片

    • 选择列

      # 当想要获取 df 中某列数据时,只需要在 df 后面的方括号中指明要选择的列即可。
      # 如果是一列,则只需要传入一个列名;如果是同时选择多列,则传入多个列名即可(注意:多个列名 用一个 list 存放)
      import pandas as pd
      import numpy as np
      df=pd.DataFrame({'name':['11','22','33'],'level':['v1','v2','v3'],'prices':[123,456,789]})
      df['name']#获取一列
      df[['name','level']]#获取多列
      df.iloc[[0,2]]#获取第几行
      
    • 按行列索引选择

      # DataFrame对象按照行列检索获取,可以使用loc和iloc函数,方括号中逗号之前的部分表示要获取的行的索#引,如果输入一个冒号,或不输入任何数值表示获取所有的行或列,逗号之后方括号表示要获取的列的索引。
      # loc与iloc获取
      data=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('ABCD'))
      #获取行为'b'的行
      data.loc['b']
      #使用iloc获取,行为'b'的行,行号为1
      data.iloc[1]
      
      # 获取'A'列所有行
      data.loc[:,'A']
      data.iloc[:,0]
      
      # 获取部分行部分列
      data.loc[['a','b','c'],['A','B']]
      data.iloc[[0,1,2],[0,1]]
      
      # 获取满足条件的行
      df[df['price']>10]
      df[(df[“支出”]>10) & (df[“性别”]=='女')]
      
  • isin()选择

    • df.isin(values) 返回结果为相应的位置是否匹配给出的 values

      values 为序列:对应每个具体值

      values 为字典:对应各个变量名称

      values 为数据框:同时对应数值和变量名称

      df.price.isin([123,789,89])
      df[df.price.isin([123,789,89])]
      df[df.price.isin(['v1','v2'])]
      df[df.level.isin(['v1','v2'])]
      
  • 排序

    • 用索引排序

      • df.sort_index(level ,ascending = True , inplace = False,na_position = 'last‘ ,first/last)
      • level :(多重索引时)指定用于排序的级别顺序号/名称18
        ascending = True :是否为升序排列,多列时以表形式提供
        inplace = False :
        na_position = 'last‘ :缺失值的排列顺序,
        first/last
      df=pd.DataFrame({'name':[11,22,3],'level':['v1','v2','v3'],'prices':[123,456,789]})
      df.set_index(['prices','name'], inplace = True )
      df.sort_index()# 通过索引进行排序 
      df.sort_index(ascending=[False])
      df.sort_index(level='name')#设置哪个索引进行排序
      df.sort_index(level=['name','prices'])
      
    • 使用变量值排序

      • df.sort_values(by,ascending = True,inplace = False ,na_position = 'last‘, first/last)
      • by :指定用于排序的变量名,多列时以列表形式提供
        ascending = True :是否为升序排列
        inplace = False :
        na_position = 'last‘ :缺失值的排列顺序,
        first/last
      df.sort_values(by='prices')
      
  • 计算新变量

    • 新变量为常数

    
    # df['vamame'] = value
    df.newvar=1#注意该命令不会报错!但并没有添加新变量
    df['high']=1#增加一列
    
    • 基于原变量做简单四则运算

      # df['var'] = df['oldvar'] *100
      # df['var'] = df.oldvar *
      import math
      df['high']=math.sqrt(16)
      df['prices']=np.sqrt(df.high)
      
    • 基于一个原变量做函数运算

      • df.apply(,func,axis = 0 ,0 ’ index’,1’ columns ')
      • func : 希望对行/列执行的函数表达式
        axis = 0 :针对行还是列逬行计算
        0 ’ index’:针对每列进行计算
        1’ columns ':针对每行逬行计算
      # 简化的用法:df [' varname ' ] = df. oldvar. apply
      df['v2']=df.high.apply(math.sqrt)
      df['v3']=df.high.apply(np.sqrt)
      
    • 不修改原df,而是生成新的df

      # df.assign(varname = expression)
      df1 = df.assign(v4=df['high'].apply(lambda x: 16))
      
    • 在指定位置插入新变量列

      • df.insert(,loc,column ,value,allow_duplicates = False,)
      • loc :插入位置的索引值,0 <= loc <= len (columns)
        column :插入的新列名称
        value : Series 或者类数组结构的变量值
        allow_duplicates = False :是否允许新列重名
      #该方法会直接修改原 df
      df1.insert(1,'d1',100)# 指定位置增加新列
      df1.insert(1,'d2',df.v2.apply(lambda x: 16))
      
  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值