pandas数据处理
1、删除重复元素
使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True
-
使用drop_duplicates()函数删除重复的行
-
使用duplicated()函数查看重复的行
import numpy as np
import pandas as pd
from pandas import Series,DataFramedf=DataFrame(data=np.random.randint(0,100,size=(8,3)),columns=list(“ABC”))
df.loc[3]=df.loc[1]
df.loc[5]=df.loc[1]
df
#=================================
A B C
0 63 33 92
1 72 16 51
2 60 8 16
3 72 16 51
4 52 80 19
5 72 16 51
6 8 85 40
7 91 14 14 -
keep表示要保留哪一个重复行,first保留第一个,last表示保留最后一个
df.duplicated(keep=“last”) -
可以借助dupicated函数来过滤出重复的行
df[df.duplicated(keep=“first”)] -
可以使用重复行的索引对重复行进行删除
df.drop(df[df.duplicated(keep=“first”)].index) -
可以直接使用drop_duplicates删除重复行
df.drop_duplicates(keep=“first”) -
如果使用pd.concat([df1,df2],axis = 1)生成新的DataFrame,新的df中columns相同,使用duplicate()和drop_duplicates()都会出问题
- 映射
映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
包含三种操作:
- replace()函数:替换元素(DataFrame\Series的函数)
- 最重要:map()函数:新建一列(Series的函数)
- rename()函数:替换索引(DataFrame的函数)
- replace()函数:替换元素
使用replace()函数,对values进行替换操作
dic = {
"name":["lucy","mery","tom"],
"age":[29,25,18],
"address":["北京",np.nan,"上海"]
}
df = DataFrame(data=dic)
df
#======================================================
address age name
0 北京 29 lucy
1 NaN 25 mery
2 上海 18 tom
-
单值替换
df.replace(to_replace=“北京”, value=“广州”, inplace=True) -
多值替换,使用列表
df.replace(to_replace=[“广州”,np.nan], value=[“北京”,“深圳”]) -
添加一列
df[“oldname”] = [“lucy”,“MERYGG”,“TOMGG”]
df
#==========================================================
address age name oldname
0 广州 29 lucy lucy
1 NaN 25 mery MERYGG
2 上海 18 tom TOMGG -
默认会把所有满足条件的值都替换
df.replace(to_replace=“lucy”, value=“Lucy”) -
指定列替换
df.replace(to_replace={“name”:“lucy”},value=“张小红”) #name是lucy的一列 -
使用字典多值替换
df.replace(to_replace={“lucy”:“小红”,“tom”:“小明”})#lucy改为小红 tom改为小明 -
method设置填充方式,bfill向后, ffill向前
s1 = s.replace(to_replace=“小红”,value=“luc”)
s1.replace(to_replace=“lucy”,method=“bfill”, limit=1)
Series替换操作
单值替换 -
普通替换
-
字典替换
多值替换 -
列表替换
-
字典替换(推荐)
Series参数说明: method:对指定的值使用相邻的值填充 limit:设定填充次数
DataFrame替换操作
单值替换
-
普通替换
- 按列指定单值替换{列标签:替换值}
-
多值替换
-
列表替换
-
单字典替换(推荐)
- map()函数:新建一列
map函数是series的函数 ,一般是对df的某一列进行整体的映射处理
- map()可以映射新一列数据
- map()可以接收一个字典
- map()中可以使用lambd表达式
- map()中可以使用方法,可以是自定义的方法
注意
-
map()中不能使用sum之类的函数,for循环
-
map(字典) 字典的键要足以匹配所有的数据,否则出现NaN
dic = {
“name”:[“lucy”,“mery”,“tom”,“rose”,“jack”],
“python”:[100,90,89,90,99]
}
df = DataFrame(data=dic)
df
#=========================================================
name python
0 lucy 100
1 mery 90
2 tom 89
3 rose 90
4 jack 99 -
使用字典一般处理离散型数据的映射
df[“name”].map({“tom”:“小明”}) -
可以使用字典的get函数处理,当字典的键能匹配就返回对应的值,否则返回原始值
def map_function(x):
return dic.get(x,x) -
函数作为map的映射条件,传入的是函数名,接受的参数,每一个要映射的列内的数据
df[“name”].map(map_function) -
lambda表达式和函数一般处理数值型的映射
f = lambda x : dic.get(x,x) -
数值型的映射
简单的数学逻辑,使用lambda表达式即可
df2 = df[“python”].map(lambda x: x-np.random.randint(0,40,size=1)[0]) -
复杂的逻辑,可以使用函数处理
def map_function(x):
if x >= 90:
return “A”
elif x >= 80:
return “B”
elif x >= 70:
return “C”
elif x >= 60:
return “D”
else:
return “E”复杂的逻辑,可以使用函数处理
df2.map(map_function)
3)transform()和map()类似
df2.transform(map_function)
-
# 新增一列 df["score"] = df["python"].map(map_function)
- 修改一列
df[“name”] = df[“name”].map(map_dic)
df
直接传入一个字典 (键值对多、少)
传入一个lmabda表达式(简单数学逻辑)
传入一个函数 (复杂数学、业务逻辑)
新增、修改
- rename()函数:替换索引
仍然是新建一个字典
使用rename()函数替换行索引
-
mapper 替换所有索引
-
index 替换行索引
-
columns 替换列索引
-
level 指定多维索引的维度
score = pd.concat((df, df), axis=1, keys=[“上学期”,“下学期”])
-
mapper是一个字典,可以与axis配合使用
score.rename(mapper={“上学期”:“first”,“下学期”:“second”}, axis=“columns”)
-
score.rename(columns={"上学期":"期中"})
-
score.rename(index={0:"first"}) #===================================== 上学期 下学期 name python score state name python score state first 小明 100 A excellent 小明 100 A excellent 1 MERY 90 A passed MERY 90 A passed 2 TOME 89 B failed TOME 89 B failed 3 ROSE 90 A passed ROSE 90 A passed 4 JACK 99 A passed JACK 99 A passed
-
-
使用level控制多层级索引的层级
score.rename(mapper={“上学期”:“first”}, level=0, axis=“columns”)score.rename(mapper={"name":"first"}, level=1, axis="columns") #================================================================== 上学期 下学期 first python score state first python score state 0 小明 100 A excellent 小明 100 A excellent 1 MERY 90 A passed MERY 90 A passe
replace 替换值
map 映射列
rename 替换索引
- 使用聚合操作对数据异常值检测和过滤
-
使用describe()函数查看每一列的描述性统计量
df = DataFrame(data=np.random.randn(1000,3), columns=list(“ABC”))
dfdf.describe()
#========================================
A B C
count 1000.000000 1000.000000 1000.000000
mean 0.016893 0.039862 0.006014
std 0.990359 0.978503 1.052478
min -3.131483 -2.885232 -3.370884
25% -0.659933 -0.573885 -0.695871
50% 0.036864 -0.000019 0.033903
75% 0.682574 0.717870 0.735325
max 2.812960 2.741870 3.438355 -
查看数据类型
查看数据类型
df.info() -
使用std()函数可以求得DataFrame对象每一列的标准差
df.std()
根据每一列或行的标准差,对DataFrame元素进行过滤。
借助any()或all()函数, 测试是否有True,有一个或以上返回True,反之返回False
对每一列应用筛选条件,去除标准差太大的数据
删除特定索引df.drop(labels,inplace = True)
- 排序
-
dataframe自带的排序函数,根据某一列排序 排序所依赖的列必须是数值型
df.sort_values(“A”)
使用.take()函数排序
- take()函数接受一个索引列表,用数字表示
- eg:df.take([1,3,4,2,5])
可以借助np.random.permutation()函数随机排序
df = DataFrame(data=np.random.randint(0,100,size=(5,5)), columns=list("ABCDE"), index=list("abcde"))
df
df.take([1,3,2,4,0])
# 可以任意重组表格的顺序
df.take([0,1,0])
np.random.permutation(10)
=======================================
array([6, 1, 5, 3, 8, 7, 9, 2, 0, 4])
# take和permutation函数联合,可以处理随机排序
df.take(np.random.permutation(df.shape[0]))
随机抽样
# take与randint函数结合,可以处理随机抽样
df.take(np.random.randint(0,5,size=3))
当DataFrame规模足够大时,直接使用np.random.randint()函数,就配合take()函数实现随机抽样
- 数据分类/组处理【重点】
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
- 分组:先把数据分为几组
- 用函数处理:为不同组的数据应用不同的函数以转换数据
- 合并:把不同组得到的结果合并起来
数据分类处理的核心:
- groupby()函数
- groups属性查看分组情况
res = df.groupby("item")
# 可以使用groups来获取分组情况
res.groups
-
总结:数据类型是离散的可以分组,连续的没有意义
- 数据分组 groupby(“item”) groupby([“item”,“color”])
- 数据聚合 res.mean() res.agg({})
- 数据合并 pd.merge()
6.0 高级数据聚合
In [ ]:
# sum()
# mean()
使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
-
df.groupby(‘item’)[‘price’].sum() <==> df.groupby(‘item’)[‘price’].apply(sum)
-
transform和apply都会进行运算,在transform或者apply中传入函数即可
-
transform和apply也可以传入一个lambda表达式
针对某一列设计的聚合函数
针对所有列设计,需要考虑不同类型的问题
def function(items):
res = 0
for item in items:
res += item
return res
==========================================
r1 = res.apply(function)
r2 = res.transform(function)
#===========================================
item
冬瓜 159
白菜 62
萝卜 99
辣椒 101
Name: weight, dtype: int64
0 99
1 99
2 99
3 62
4 62
5 101
6 101
7 159
8 159
Name: weight, dtype: int64