【数据科学】05 数据合并(merge、concat、combine)与数据清洗(缺失值、重复值、内容和格式)
文章目錄
- 1. 數據合并
- 1.1 merge()合并
- 1.2 concat()合并
- 1.3 combine()合并
- 2. 數據清洗
- 2.1 缺失值
- 2.2 重復值
- 2.3 內容與格式清洗
1. 數據合并
實際應用中,需要分析的數據可能來自不同的數據集,因此在開始數據分析之前,需要先將不同的數據集合并。
pandas中提供了三種不同的數據合并方式:
1.1 merge()合并
pd.merge(left,right,[參數列表])
| left | 參與合并的左側DataFrame對象,必填 |
| right | 參與合并的右側DataFrame對象,必填 |
| how | 連接方式,“inner”、“outer”、“left”、“right”其中之一,默認為“inner” |
| on | 用于連接的列名(或列名列表);未指定改參數時,為左右數據集的公共列 |
| left_on | 左側DataFrame對象中用于連接的鍵 |
| right_on | 右側DataFrame對象中用于連接的鍵 |
| left_index | 布爾型,是否將左側DataFrame對象的行索引用作連接鍵 |
| right_index | 布爾型,是否將右側DataFrame對象的行索引用作連接鍵 |
| sort | 是否根據連接鍵對合并后的數據排序,默認為True |
| suffixes | 字符串值元組,用于追加到重疊列名的末尾,默認為‘_x’和‘_y’ |
inner:內連接,連接兩個DataFrame對象鍵值的交集的行
outer:外連接,連接兩個DataFrame對象鍵值的并集的行
left:左鏈接,取出左側DataFrame對象的全部行,連接右側DataFrame對象鍵值匹配的行
right:右鏈接,取出右側DataFrame對象的全部行,連接左側DataFrame對象鍵值匹配的行
1.2 concat()合并
pd.concat(objs,axis,[參數列表])
| objs | 需要連接的對象,如[df1, df2] |
| axis | 連接的軸,默認為0;axis=0,按行堆疊;axis=1,按列堆疊 |
| join | 默認為“outer”,outer為并集/inner為交集 |
| ignore_index | ignore_index 忽略需要連接的frame本身的index,當原本的index沒有特別意義的時候可以使用 |
| join_axes | Index對象列表,用于其他n-1軸的特定索引,而不是執行內部/外部設置邏輯 |
| keys | 可以給每個需要連接的df一個label |
| levels | 序列列表,默認值無;用于構建MultiIndex的特定級別(唯一值) |
| names | list,default無,結果層次索引中的級別的名稱 |
| verify_integrity | boolean,default False;檢查新連接的軸是否包含重復項 |
| copy | boolean,default True |
1.3 combine()合并
-
df1.combine_first(df2)
專門針對df1中的空值進行處理。
當行、列索引相同時:用df2數據集來填充df1中的缺失值
當行、列索引不同時:結果中的列是兩個數據集列的并集,結果中的行是兩個數據集行的并集,并用df2的對應值填充df1中的NA值
-
df.combine(other, func, fill_value=None, overwrite=True)
基于傳遞的函數執行與另一個DataFrame的逐列組合。
使用func將DataFrame與其他 DataFrame 組合到按元素組合的列。生成的DataFrame的行索引和列索引將是兩者的并集。
| other | DataFrame,要按列合并的DataFrame |
| func | 將兩個系列作為輸入并返回一個Series或一個標量的函數,用于逐列合并兩個數據幀 |
| fill_value | 標量值,默認None;在將任何列傳遞給合并函數之前填充NaN的值 |
| overwrite | boolean,默認為True;如果為true,列自我不存在在其他將與NaN的覆蓋 |
2. 數據清洗
2.1 缺失值
1. 識別缺失值
- df.isnull()
判斷dataframe每行每列的元素是否為缺失值,分別用False和True表示 - df.isnull().any() && df.isnull().any(1)
查看所有列、行是否有缺失值 - df.isnull().all() && df.isnull().all(1)
查看所有列、行是否全部為缺失值
2. 處理缺失值
- 濾除缺失值
df.dropna(how, axis, thresh, inplace)
| how | 取值為any或all,how=‘all’值丟棄全部NA的行(列) |
| axis | 軸向參數,默認為0;axis=0,丟棄行數據;axis=1,丟棄列數據 |
| thresh | 保留部分觀測數據,例如thresh=3,則當一行(列)有3個或以上非NA值才保留 |
| inplace | 默認為False;inplace=True表示修改調用者而不產生副本 |
- 填充缺失值
df.fillna()
| value | 用于填充缺失值的標量值或字典對象 |
| method | 用于填充缺失值的方法。method=‘ffill’,向前填充;method=‘bfill’,向后填充。也可以使用平均值或中位數等統計學方法,如method=df.mean() |
| axis | 待填充的軸,默認axis=0,按列填充 |
| inplace | 默認為False;inplace=True表示修改調用者而不產生副本 |
注:不同列的缺失值用不同的數值來填充,需要構造{列索引名:值}形式的字典對象作為參數。
#把體重的缺失值用該列的均值填充,心率缺失值用默認值75填充 patient_data.fillna({'體重':patient_data['體重'].mean(),'心率':75}, inplace=True)2.2 重復值
1. 查看重復值
df.duplicated()
查看DataFrame對象df中是否有重復行,返回一個布爾型的Series
2. 刪除重復值
df.drop_duplicates()
刪除df中重復的數據行,結果中默認保留第一個出現的值組合,傳入take_last=True則保留最后一個。
注:上面的兩個方法會默認判斷全部列,也可以對部分列進行重復項判斷或刪除,只需傳入列名或列名的列表。
df.drop_duplicates(['column_a'])2.3 內容與格式清洗
1. replace數據替換
df.replace(to_replace,value,[參數列表])
| to_replace | 要替換掉的值 |
| value | 替換后的新值 |
| inplace | 是否修改原始數據,默認為False |
如果一次需要修改多個值,則可以傳入一個列表和要替換的值:
df.replace([270,1400],np.nan) #把270,1400 均替換成NaN對不同的值進行不同的替換,傳入一個替換關系組成的列表或字典:
df.replace({'U.S.A.':'USA','U.K.':'UK'})2. iterrows()迭代器遍歷
df.iterrows()
iterrows()返回值為元組(index,row)
總結
以上是生活随笔為你收集整理的【数据科学】05 数据合并(merge、concat、combine)与数据清洗(缺失值、重复值、内容和格式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误隐藏学习手记(六)
- 下一篇: 【java】drools入门之LHS和R