Pandas數據去重和對重復數據分類、求和,得到未重復和重復(求和后)的數據


 


人的理想志向往往和他的能力成正比。 —— 約翰遜


 

其實整個需求呢,就是題目。2018-08-16

需求的結構圖:

 

涉及的包有:pandas、numpy

1、導入包:

import pandas as pd import numpy as np
View Code

2、構造DataFrame,里面包含三種數據類型:int、null、str 

data = {"number":[1,1,np.nan,np.nan,2,2,1,2,2],
        "letter":['a','b',np.nan,np.nan,'c','d','b','c','d'],
        "label":[1,1,9,9,2,2,1,2,2]}
dataset1 = pd.DataFrame(data) #初始化DataFrame 得到數據集dataset1
print(dataset1)
View Code

3、空值填充

由於數據集里含有空值,為了能夠對后面重復數據進行求和,則需要對空值進行填充

dataset = dataset1.fillna("NULL")
print(dataset)
View Code

4、利用duplicated()函數和drop_duplicates()函數對數據去重

首先,利用duplicated()函數按列名'letter'和' number '取重復行,其返回的是bool類型,若為重復行則true,反之為false

duplicate_row = dataset.duplicated(subset=['letter',' number '],keep=False) 
print(duplicate_row)
View Code

然后通過bool值取出重復行的數據

duplicate_data = dataset.loc[duplicate_row,:]
print(duplicate_data)
View Code

再然后根據'letter',' number '對重復數據進行分類,在該前提下並對重復數據的’label’進行求和,且重置索引(對后文中的賦值操作有幫助)

duplicate_data_sum = duplicate_data.groupby(by=['letter',' number ']).agg({' label ':sum}).reset_index(drop=True)
Print(duplicate_data_sum)
View Code

取出重復數據中的一個,例如:1,1,2,2——>1,2

 對drop_duplicates指定列:subset=['letter',' number '],保留第一條重復的數據:keep="first"

duplicate_data _one= duplicate_data.drop_duplicates(subset=['letter',' number '] ,keep="first").reset_index(drop=True)
Print(duplicate_data)
View Code

 

獲取不重復的數據,指定列subset=['letter',' number ',' label '],不保留重復數據:keep=False

no_duplicate = dataset.drop_duplicates(subset=['letter',' number ',' label '] ,keep=False)
Print(no_duplicate)
View Code

將對重復值的’label’求和,並賦值給“重復值中的一個”,得到新的”新重復值中的一個

duplicate_data _one ["label"] = duplicate_data_sum ['label']  #前面需要重置索引
print(duplicate_data_one)
View Code

最后,拼接新重復值中的一個”和不重復的數據

Result = pd.concat([no_duplicate,duplicate_data _one])
Print(result)
View Code

 

5、全體代碼:

 

 1 import pandas as pd
 2 import numpy as np
 3 
 4 #構造DataFrame
 5 data = {"number":[1,1,np.nan,np.nan,2,2,1,2,2],
 6         "letter":['a','b',np.nan,np.nan,'c','d','b','c','d'],
 7         "label":[1,1,9,9,2,2,1,2,2]}
 8 dataset1 = pd.DataFrame(data)
 9 
10 #空值填充
11 dataset = dataset1.fillna("NULL")
12 #得到重復行的索引
13 duplicate_row = dataset.duplicated(subset=['letter','number'],keep=False) 
14 #得到重復行的數據
15 duplicate_data = dataset.loc[duplicate_row,:]
16 #重復行按''label''求和
17 duplicate_data_sum = duplicate_data.groupby(by=['letter','number']).agg({'label':sum}).reset_index(drop=True)
18 
19 #得到唯一的重復數據
20 duplicate_data_one= duplicate_data.drop_duplicates(subset=[
21     'letter','number'],keep="first").reset_index(drop=True) 
22 #獲得不重復的數據
23 no_duplicate = dataset.drop_duplicates(subset=['letter','number','label']
24                         ,keep=False)
25 #把重復行按"label"列求和的"label"列賦值給唯一的重復數據的"label"列
26 duplicate_data_one ["label"] = duplicate_data_sum ['label']
27 Result = pd.concat([no_duplicate,duplicate_data_one]
View Code

 

主要用到幾個關鍵的函數:

Pandas.concat()

DataFrame.duplicated()

DataFrame.drop_duplicates().reset_index(drop=True)

DataFrame.groupby().agg({})


 

本人處於學習中,如有寫的不夠專業或者錯誤的地方,誠心希望各位讀者多多指出!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM