資料清洗
缺失值處理
缺失值處理是資料清洗中的重要步驟,常見的方法包括刪除缺失值、用均值/中位數/眾數填充缺失值等。
範例程式碼:
# 查詢有多少缺失值
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
)