在日常處理資料的過程中,我們經常遇到帶有合并單元格的excel檔案,或者帶有空值的csv檔案,使用excel打開後如下圖所示,但這對資料分析是很不友好的,作為一個Data Analyst,看到這麼糟心的資料,怎麼能忍?趕緊掏出萬能的Pandas來tidy data!
帶有合并單元格的資料(示例
需求分析:想要根據哪一列的粒度整理資料?
- 如果是class_id這一列,則整理後的結果将成為4行,同一個class_id下的student_list将會被合并到一個單元格内,可以考慮使用 , 将不同的元素隔開
- 如果是student_list這一列,則整理後的結果将成為8行,有合并單元格的列将會被拆分開來,且在有空值的位置補上對應的正确的值
處理步驟
準備工作
- 用到的庫:pandas
- 用到的函數:fillna(),groupby(),agg(),merge()
1.讀取資料
可以看到将資料讀取到DataFrame後,在有合并單元格的列中,将會有值為NaN的單元格出現
# 引入 pandas 庫
import pandas as pd
# 讀取樣例資料,這裡讀取的是 csv 資料
df = pd.read_csv("../data/test.csv")
測試資料
2.尋找主鍵列并為空值單元格填充資料
需要先找出一個沒有重複值且帶有合并單元格的列或組合列,也叫主鍵或聯合主鍵,通過以下代碼将隻為空的單元格進行填充。本例以class_id列為例。
df['class_id'] = df['class_id'].fillna(method='ffill')
可以看到class_id這一列的空值已被填充,且産生了重複值。
為主鍵填充空值
如果你是需求分析中的需求2,那麼到這一步其實已經接近最終結果了,你可以采用同樣的方法将其他兩列的空值進行填充,或者對多個列同時進行空值填充:df = df[['class_id', 'class_name', 'remark']].fillna(method='ffill')。
如果你是需求分析中的需求1,那麼請繼續以下步驟。
3.對資料進行分組
本步驟需要對沒有合并單元格的列根據上一步中所使用的列進行分組,并将組内的資料使用,連接配接起來。本例中使用的沒有合并單元格的列是student_list列。可以看到示例資料集已經被根據class_id分為4組,且各組内的student_list元素已分别被,連接配接起來放到一個單元格中,新生成的 df_student資料集的索引是class_id。
df_student = df.groupby('class_id').agg({"student_list": ', '.join})
對資料進行分組
4.去除帶有空值的行
此步需要對原資料進行中帶有空值的行去掉,并将student_list列丢棄。
丢棄student_list列的原因是:在上一步已經生成了一個新的資料集df_student,這個資料集中的student_list列才是我們想要的資料
# axis=0 代表去除帶有一個或多個空值的行,對應的 axis=1 代表去除帶有一個或多個空值的列,本例中我們需要去除帶有空值的行
df = df.dropna(axis=0).drop('student_list', axis=1)
去除帶有空值的行後的資料
5.合并資料集
此步驟将上述步驟中産生的兩個資料集df和df_student進行合并,得到最終想要的結果集。
# 采用 merge() 函數将 df 和 df_student 根據 class_id 進行左連接配接合并資料
# left_on='class_id' 代表 df 采用 class_id 作為連接配接條件
# right_index=True 代表 df_student 将索引作為連接配接條件
df = pd.merge(df, df_student, how='left', left_on='class_id', right_index=True, copy=False)
最終結果集
補充:資料連接配接示意圖
資料連接配接示意圖
如果你覺得此文對你有幫助,請記得 點贊 收藏 + 關注 哦