#
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 数据分类处理(重点)
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)
def fun(s): #复数 [] () sum = 0 for i in s: #遍历[] () sum+=s return sum/s.size #求均值 #使用transform函数求出水果的平均价格 df.groupby(by='item')['price'].transform(fun)
#apply还可以代替运算工具形式map def fun(s): return s+1 s = Series(data=[1,2,3]) s.map(fun) #对传入的可迭代对象 每一项都做的操作 s.apply(fun) #