【Day10-去重】使用python优雅的一行解决list或DataFrame资料去重问题

前一天,我们简单讨论了一下面对缺失值资料的处理
那今天就反过来讨论一下面对资料中有重复的情况应该要怎麽处理好了

list元素去重

使用set——不维持原来顺序

利用集合set本身就不会包含重复元素的特性,来保留单一的值
但因为set是无序的,所以重新转回list的时候就未必会维持原本的顺序

# 使用set,不维持原来顺序
A = [1,3,5,1,2]
list(set(A))

输出:

[1, 2, 3, 5]

使用dict——维持原来顺序

要维持本来的顺序其实也有很多种方法,像是把本来的index再拿来排序或是用一堆for的方式,但笔者这边只推荐一种最优雅的方式(都写python了还没事搞那麽多行干嘛XD)
我们这边利用了在python3.6以後的版本中对於dict会因为添加的顺序而为有序的特性来进行,所以只需要一行就可以搞定了

# 使用dict,维持原来顺序(限python3.6及以後版本)
A = [1,3,5,1,2]
list(dict.fromkeys(A))

输出:

[1, 3, 5, 2]

如果你好奇这python3.6关於这部分具体的更新内容,可以参考这里

DataFrame元素去重复

先建立一个有重复资料的范例

# %%
# DataFrame元素去重复
import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob", "Bob", "Bob", "Carol"],
                   "Score": [100, 95, 97, 97, 95]})
df

依据所有栏位去重复

# 使用drop_duplicates()方法来去除重复,预设考虑所有column
df.drop_duplicates()


这边可以发现index=3的那笔资料因为和index=2的完全一样,所以就被删除了

依据特定栏位去重复(可复选)

# 使用subset参数来控制指定的栏位
df.drop_duplicates(subset=["Name"])


这边我们只考虑Name栏位,因此1,2,3三笔相同都是Bob的资料就只会被留下第一笔

那可以留下最後一笔吗?

# 预设keep="first",可以改成"last"来保留重复的最後一笔资料
df.drop_duplicates(subset=["Name"],keep="last")


<<:  【Day 10】Concurrency control in apps

>>:  D25 - 如何用 Apps Script 自动化地创造与客制 Google Sheet?(二)结合股票价格通知与信件

Kotlin Android 第7天,从 0 到 ML - list 、set 和 map

前言: 今天要介绍的是list set 和 map。 大纲: List 是只可读 , 不可修改 va...

[Android Studio 30天自我挑战] 完赛心得

完赛心得 今天是铁人赛的最後一天, 一开始以为要写30篇的技术文章有点太难了, 为了写不一样的内容让...

Day4 Let's ODOO: Model(1) Class & Attribute

ODOO透过Model来定义资料表中的栏位与关联,我们今天介绍一个Model的类别以及属性。 我们以...

Day 12:Python基本介绍05 | 流程控制、回圈

各位安安,今天讲的是对任何程序语言都很重要也很基础的流程控制和回圈的概念,如果你先前已经学过其他程序...

[Day 13] .Net Task 底层(6)

前言 今天我们来看看, 当创建一个 task 物件, 设定完要做的行为已及排程方式後, 会调用两个方...