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

 

posted @ 2019-07-02 23:31  追风zz  阅读(233)  评论(0编辑  收藏  举报