資料清洗

缺失值處理

缺失值處理是資料清洗中的重要步驟,常見的方法包括刪除缺失值、用均值/中位數/眾數填充缺失值等。

範例程式碼:


                # 查詢有多少缺失值
                missing_values = data.isnull().sum()[data.isnull().sum() > 0]
                print("缺失值統計:\n", missing_values)

                # 查詢有多少缺失值比例(篩選>50%):篩選顯示 > .5
                missing_values_percent = data.isnull().sum()[data.isnull().sum()/len(data) > .5]
                print("缺失值比例統計:\n", missing_values_percent)

                # 刪除特定列的缺失值,並重設索引
                data.dropna(subset=['column_name'], inplace=True)
                data.reset_index(drop=True, inplace=True)

                # 刪除整行有缺失值的資料
                data.dropna(axis=0, inplace=True)

                # 用均值填充缺失值
                data['column_name'].fillna(data['column_name'].mean(), inplace=True)

                # 用中位數填充缺失值
                data['column_name'].fillna(data['column_name'].median(), inplace=True)

                # 用眾數填充缺失值
                data['column_name'].fillna(data['column_name'].mode()[0], inplace=True)

                # pd.NA 與 np.nan 的區別
                # pd.NA 是 pandas 的缺失值標記,適用於所有資料
                # np.nan 是 NumPy 的缺失值標記,主要用於浮點數資料
                # pd.NA 可以與其他資料類型(如字串)一起使用,而 np.nan 主要用於數值資料
            
異常值處理

異常值處理是資料清洗中的重要步驟,常見的方法包括刪除異常值、用均值/中位數/眾數填充異常值等。

範例程式碼:


                # 刪除異常值
                data = data[data['column_name'] < upper_bound]
                data = data[data['column_name'] > lower_bound]

                # 多條件篩選異常值
                data = data[(data['column_name'] < upper_bound) & (data['column_name'] > lower_bound)]

                # 填充異常值
                data['column_name'].fillna(data['column_name'].mean(), inplace=True)
            
重複值處理

重複值處理是資料清洗中的重要步驟,常見的方法包括刪除重複值、合併重複值等。

範例程式碼:


                # 刪除重複值
                data.drop_duplicates(inplace=True)

                # 合併重複值
                data = data.groupby('column_name').mean().reset_index()
            
資料類型轉換

資料類型轉換是資料清洗中的重要步驟,常見的方法包括將字串轉換為數值、將日期轉換為時間戳等。

範例程式碼:


                # 將字串轉換為數值
                data['column_name'] = data['column_name'].astype('float')

                # 將日期轉換為時間戳
                data['date_column'] = pd.to_datetime(data['date_column'])
                data['date_column'] = pd.to_datetime(data['date_column'], format='%d.%m.%Y %H:%M:%S') # 指定format格式
                data["date_column"] = pd.to_datetime(dict(year = data["year"], month = data["month"], day=1)) # 另一種以dict函數轉換日期的方式
                data['timestamp'] = data['date_column'].astype('int64') // 10**9
            
以函數處理資料

以函數處理資料是資料清洗中的重要步驟,常見的方法包括使用apply函數、map函數等、transform函數。

範例程式碼:


                # 使用apply函數
                # apply函數可以對DataFrame的每一列或每一行應用一個函數              
                data['column_name'] = data['column_name'].apply(lambda x: x*2)

                # 使用map函數
                # map函數可以對Series的每一個元素應用一個函數
                data['column_name'] = data['column_name'].map(lambda x: x*2)

                # 使用transform函數
                # transform函數可以對DataFrame的每一列或每一行應用一個函數,並返回與原DataFrame相同形狀的結果
                data['column_name'] = data['column_name'].transform(lambda x: x*2)
            
資料排序、合併、聚合、分割

資料排序是資料清洗中的重要步驟,常見的方法包括根據某一列進行升序或降序排序。

範例程式碼:


                # 根據某一column進行升序排序
                data.sort_values(by='column_name', axis=1, ascending=True, inplace=True)
                # 根據某一column的list進行升序排序
                data.sort_values(by=['column_name1','column_name2','column_name3'], axis=1, ascending=True, inplace=True)

                # 合併兩個DataFrame
                data1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
                data2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
                merged_data = pd.concat([data1, data2], ignore_index=True)  # 合併兩個DataFrame,忽略索引

                # merge兩個DataFrame
                merged_data = pd.merge(data1, data2, on='A', how='inner')  # 根據'A'列合併兩個DataFrame,使用內連接
                merged_data = pd.merge(data1, data2, on='A', how='outer')  # 根據'A'列合併兩個DataFrame,使用外連接
                merged_data = pd.merge(data1, data2, on='A', how='left')  # 根據'A'列合併兩個DataFrame,使用左連接
                merged_data = pd.merge(data1, data2, on='A', how='right')  # 根據'A'列合併兩個DataFrame,使用右連接

                # 聚合運算
                # 聚合col_name1-2分別計算個別column平均值
                data = data.groupby(['col_name1','col_name2']).mean()
                # 時間序列index,以時間分組運算平均值,範圍1日
                df = df.groupby(pd.Grouper(freq='1d')).mean()

                # column資料分割
                COL_SP = ['col_sp1','col_sp2','col_sp3']
                df[COL_SP] = df['column_name'].str.split('-', expand=True) # 將column_name之column內容以'-'分割為指定數量column
            
資料取值

資料取值是資料清洗中的重要步驟,常見的方法包括根據條件篩選資料、根據索引取值等。

範例程式碼:


                # 根據條件篩選資料
                filtered_data = data[data['column_name'] > 10]

                single_value = data.at[0, 'column_name']  # 取第一行的某一列的值
                single_value = data.iat[0, 1]  # 取第一行的第二列的值
                value = data.loc[0, 'column_name']  # 取第1 row 的 'column_name' column 的值,回傳單一值
                values = data.iloc[0:5, 1:3]  # 取rows 0~5且columns 1~3,回傳DataFrame
                values = data.iloc[5]  # 取第6 row的資料,回傳Series
                values = data.iloc[:6]  # 取前5 rows(0-5 index)的資料,回傳DataFrame
                values = data.iloc[:,5]  # 取所有rows、第6 column的資料,回傳DataFrame

                # 依據row index取值
                df = df.groupby(['col_name1','col_name2']).mean()
                df.xs(key=70,axis=0,level="col_name1") # 根據上條groupby的 col_name1 層級取值,回傳DataFrame

                # 根據條件取值,回傳Series
                values = data[data['column_name'] > 10]['another_column']

                # 根據多重條件取值,回傳Series
                values = data[(data['column1'] > 10) & (data['column2'] < 5)]

                # 指定3個column取值,回傳DataFrame
                values = data[['column1', 'column2', 'column3']]

                # 列表篩選取值
                values = ['val1','val2','val3']
                get_val = df[df['column_name'].isin(values)] # 當 column_name column值內含有['val1','val2','val3']值時,回傳該DataFrame
                get_val_ex = df[-df['column_name'].isin(values)] # 當 column_name column值內不含['val1','val2','val3']值時,回傳該DataFrame。與get_val相反
            
樞紐分析

資料取值是資料清洗中的重要步驟,常見的方法包括根據條件篩選資料、根據索引取值等。

範例程式碼:


                """
                index= 以Company為樞紐聚合(Groupby)其他所有column
                columns= 將columns中的unique值作為columns
                values= 並計指定加總的column,加總上述column所有unique值對應的值
                並回傳DataFrame

                下例:以Company為樞紐,將Product的unique值作為columns,並加總Licenses的值
                """
                pd.pivot(data=df,index="Company",columns="Product",values="Licenses")


                # 以Company為樞紐聚合(Groupby)其他所有column,並計算每個column總合,並回傳僅含col_1~2二個col的DataFrame
                pd.pivot_table(df,index="Company",aggfunc="sum",values=["col_1","col_2"])

                """
                * 以Account Manager、Contact為樞紐聚合(Groupby)
                * 以Sale Price、Licenses為聚合後要回傳的欄位
                * 以Product為索引
                * 以「總合、平均、標準差」進行col的聚合計算
                * 填補缺失值的值(此表為0)
                """
                pd.pivot_table(
                    df,
                    index=["Account Manager","Contact"],
                    values=["Sale Price","Licenses"],
                    columns=["Product"],
                    aggfunc=["sum","mean","std"],
                    fill_value=0
                )