iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
AI & Data

資料三十-那些最基本的資料處理與分析技能系列 第 10

【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")


上一篇
【Day09-填空】漏漏缺缺欠欠填填刪刪補補——面對缺失值的處理方式
下一篇
【Day11-映射】淺談python的map與pandas的map用法
系列文
資料三十-那些最基本的資料處理與分析技能30

尚未有邦友留言

立即登入留言