python :pandas数据处理

本文详细介绍了Python中Pandas库的数据处理方法,包括删除重复元素、映射操作、替换值、映射新列、替换索引以及数据异常值检测和过滤。涉及的函数有drop_duplicates(), replace(), map(), rename()以及describe()等,提供了丰富的示例说明。" 136754222,1467541,ElasticSearch在渔业航迹数据优化中的应用,"['数据同步', 'Elasticsearch', 'GIS开发', 'Java开发', '数据库优化']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pandas数据处理

1、删除重复元素

使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True

  • 使用drop_duplicates()函数删除重复的行

  • 使用duplicated()函数查看重复的行

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame

    df=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()都会出问题

  1. 映射

映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定

包含三种操作:

  • replace()函数:替换元素(DataFrame\Series的函数)
  • 最重要:map()函数:新建一列(Series的函数)
  • rename()函数:替换索引(DataFrame的函数)
  1. 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替换操作

    	  单值替换
    
  • 普通替换

    • 按列指定单值替换{列标签:替换值}
  • 多值替换

  • 列表替换

  • 单字典替换(推荐)

  1. 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表达式(简单数学逻辑)
    传入一个函数 (复杂数学、业务逻辑)
    新增、修改
  1. 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 替换索引

  1. 使用聚合操作对数据异常值检测和过滤
  • 使用describe()函数查看每一列的描述性统计量

    df = DataFrame(data=np.random.randn(1000,3), columns=list(“ABC”))
    df

    df.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)

  1. 排序
  • 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()函数实现随机抽样

  1. 数据分类/组处理【重点】

数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。

数据分类处理:

  • 分组:先把数据分为几组
  • 用函数处理:为不同组的数据应用不同的函数以转换数据
  • 合并:把不同组得到的结果合并起来

数据分类处理的核心:

 - groupby()函数
 - groups属性查看分组情况

res = df.groupby("item")

# 可以使用groups来获取分组情况
res.groups
  • 总结:数据类型是离散的可以分组,连续的没有意义

    1. 数据分组 groupby(“item”) groupby([“item”,“color”])
    2. 数据聚合 res.mean() res.agg({})
    3. 数据合并 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
  • 使用apply函数得到的结果,需要合并

    使用apply函数得到的结果,需要合并

    pd.merge(df, DataFrame(r1), left_on=“item”, right_index=True, suffixes=["","_sum"])
  • # 修改series的name属性,就是修改列标签
    r2.name = "weight_sum"
    pd.concat((df, r2), axis=1)
    
  • transform 会自动匹配列索引返回值,不去重
  • apply 会根据分组情况返回值,去重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值