zoukankan      html  css  js  c++  java
  • pandas 数据处理

    #

    1 删除重复元素

    使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True
    
    - keep参数:指定保留哪一重复
    
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    #手动将df的某几行设置成相同的内容
    df = DataFrame(data=np.random.randint(0,100,size=(8,4))) #创建df
    df.iloc[1] = [33,33,33,33]
    df.iloc[3] = [33,33,33,33]
    df.iloc[6] = [33,33,33,33]
    - 使用duplicated查看所有重复元素行
    df.loc[~df.duplicated(keep='last')] #保留正常值
    df.drop_duplicates(keep='last',inplace=True) #函数删除重复的行  映射原数据 修改原df

    2 映射

    DataFrame替换操作  replace
    - 单值替换
        - 普通替换:  替换所有符合要求的元素:to_replace=15,value='e'
        - 按列指定单值替换: to_replace={列标签:替换值} value='value'
        
    - 多值替换
        - 列表替换: to_replace=[]  value=[]
        - 字典替换(推荐)  to_replace={to_replace:value,to_replace:value}
    replace 代替
    s = Series(data=[3,4,5,6,7,8])
    s.replace(3,'s') #新数据    原数据不变
    s.replace([4,5],['sx','zc']) #多值替换
    replace参数说明:
    
    method:对指定的值使用相邻的值填充替换
    limit:设定填充次数
    series
    df #dataframe
    df.replace(33,'three3') #新数据  原数据不变
    注意:DataFrame中,无法使用method和limit参数
    df.replace(to_replace={46:'one'})  #dict 形式
    df.replace(to_replace={1:33},value='TT') # 
    dataframe
    映射
    map()函数:新建一列 , map函数并不是df的方法,而是series的方法
    - map()可以映射新一列数据 - map()中可以使用lambda 表达式 - map()中可以使用方法,可以是自定义的方法 eg:map({to_replace:value}) - **注意** map()中不能使用sum之类的函数,for循环
    dic = {
        'name':['jay','jj','Liho'],
        'salary':[2000,3000,4000]
    }
    df = DataFrame(dic)  #字典作为数据源
    dic={
        'jay':'杰伦',
        'jj':'林俊'
    }
    df['c_name']=df['name'].map(dic)  #增加了一列  中文名字  series的方法
    df  #查看
    
    计算税后薪资?  缴纳50%的税
    def after_shui(s):
        if s<=2000:
            return s
        else:
            return s-(s-2000)*0.5
    df['shuihou'] = df['salary'].map(after_shui)   #lambda表达式也行
    df
    
    注意:并不是任何形式的函数都可以作为map的参数。只有当一个函数具有一个参数且有返回值,那么该函数才可以作为map的参数
    map 映射

    3 使用聚合操作对数据异常值检测和过滤

    使用df.std()函数可以求得DataFrame对象每一列的标准差
        创建一个1000行3列的df 范围(0-1),求其每一列的标准差
    df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C']) #columns 列索引设置
    df
    #对df应用筛选条件,去除标准差太大的数据:假设过滤条件为 C列数据大于两倍的C列标准差
    std_twice = df['C'].std()*2  #2倍标准差值
    hangs = ~(df['C']>std_twice)
    df.loc[hangs] #过滤掉了异常值
    
    #异常值赋值空 
    df.loc[df['C']>std_twice,'C']=np.nan
    df.fillna(axis=0,method='ffill').fillna(axis=0,method='bfill')  #新数据 填充数据
    df.fillna(axis=0,method='ffill',inplace='True') #原数据基础上修改了
    df.fillna(axis=0,method='bfill',inplace='True') #进一步修改

    4 排序

    使用.take()函数排序
        - take()函数接受一个索引列表,用数字表示,使得df根据列表中索引的顺序进行排序
        - eg:df.take([1,3,4,2,5])  #要被排序的索引  轴向
    可以借助np.random.permutation()函数随机排序
    df.take([2,1,0],axis=1) #排序了
    df #原顺序不变
    np.random.permutation(x)可以生成x个从0-(x-1)的随机数列
    random_df = df.take(np.random.permutation(3),axis=1).take(np.random.permutation(1000),axis=0) #1列  0行
    random_df[0:100]  #切片100个数据

    5 数据分类处理(重点)

    from pandas import DataFrame,Series
    
    df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                    'price':[4,3,3,2.5,4,2],
                   'color':['red','yellow','yellow','green','green','green'],
                   'weight':[12,20,50,30,20,44]})
    df #数据展示
    df.groupby('item').groups  #分组结果 
    # df.groupby('item').mean() # 均值
    mean_price = df.groupby('item')['price'].mean() # 指定字段均值 减少计算成本
    dic = mean_price.to_dict() #返回字典  映射关系表
    df['mean_price']= df['item'].map(dic) #映射回原数据  增加了一列
    df #dataframe的展示
    
    #颜色查看各种颜色的水果的平均价格     
    color_mean_price = df.groupby('color')['price'].mean() #先颜色分组 求均值
    dic = colo_mean_price.to_dict()  #转格式字典 
    df['colo_mean_price']=df['color'].map(dic) #映射数据  增加列
    df  # 查看数据

    6 高级数据聚合

    使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
        df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
        transform和apply都会进行运算,在transform或者apply中传入函数即可
        transform和apply也可以传入一个lambda表达式
    自定义函数/方法
    def fun(s): #复数  []  ()
        sum = 0
        for i in s:  #遍历[]  ()
            sum+=s
        return sum/s.size  #求均值
    #使用apply函数求出水果的平均价格
    df.groupby(by='item')['price'].apply(fun)
    apply 返回series 需要做映射  
    def fun(s): #复数  []  ()
        sum = 0
        for i in s:  #遍历[]  ()
            sum+=s
        return sum/s.size  #求均值
    
    #使用transform函数求出水果的平均价格
    df.groupby(by='item')['price'].transform(fun)
    transform 不需要做映射
    #apply还可以代替运算工具形式map
    def fun(s):
        return s+1
        
    s = Series(data=[1,2,3])
    s.map(fun) #对传入的可迭代对象  每一项都做的操作
    s.apply(fun) #
    apply还可以代替运算工具形式map
  • 相关阅读:
    (转) [组合数学] 第一类,第二类Stirling数,Bell数
    The Heaviest Non-decreasing Subsequence Problem
    高斯枚举自由元小板子 (待测试)
    gperftools::TCMalloc
    tinyxml2
    pugixml
    std::weak_ptr
    enable_shared_from_this
    mfc字符转码
    std::multiset
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/11123819.html
Copyright © 2011-2022 走看看