pandas 数据处理
Posted zhangchen-sx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:设定填充次数
df #dataframe df.replace(33,‘three3‘) #新数据 原数据不变 注意:DataFrame中,无法使用method和limit参数 df.replace(to_replace=46:‘one‘) #dict 形式 df.replace(to_replace=1:33,value=‘TT‘) #
映射
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的参数
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 数据分类处理(重点)
以上是关于pandas 数据处理的主要内容,如果未能解决你的问题,请参考以下文章