在日常處理數(shù)據(jù)的過程中,我們經(jīng)常遇到帶有合并單元格的excel文件帮辟,或者帶有空值的csv文件速址,使用excel打開后如下圖所示,但這對數(shù)據(jù)分析是很不友好的由驹,作為一個Data Analyst芍锚,看到這么糟心的數(shù)據(jù),怎么能忍蔓榄?趕緊掏出萬能的Pandas來tidy data!
需求分析:想要根據(jù)哪一列的粒度整理數(shù)據(jù)并炮?
- 如果是
class_id
這一列,則整理后的結(jié)果將成為4行
甥郑,同一個class_id
下的student_list
將會被合并到一個單元格內(nèi)逃魄,可以考慮使用,
將不同的元素隔開 - 如果是
student_list
這一列,則整理后的結(jié)果將成為8
行澜搅,有合并單元格的列將會被拆分開來伍俘,且在有空值的位置補上對應的正確的值
處理步驟
準備工作
- 用到的庫:
pandas
- 用到的函數(shù):
fillna()
,groupby()
,agg()
,merge()
1.讀取數(shù)據(jù)
可以看到將數(shù)據(jù)讀取到DataFrame后,在有合并單元格的列中店展,將會有值為NaN
的單元格出現(xiàn)
# 引入 pandas 庫
import pandas as pd
# 讀取樣例數(shù)據(jù)养篓,這里讀取的是 csv 數(shù)據(jù)
df = pd.read_csv("../data/test.csv")
2.尋找主鍵列并為空值單元格填充數(shù)據(jù)
需要先找出一個沒有重復值且?guī)в泻喜卧?/strong>的列
或組合列
,也叫主鍵
或聯(lián)合主鍵
赂蕴,通過以下代碼將只為空的單元格進行填充柳弄。本例以class_id
列為例。
df['class_id'] = df['class_id'].fillna(method='ffill')
可以看到class_id
這一列的空值已被填充概说,且產(chǎn)生了重復值碧注。
如果你是需求分析中的需求2
,那么到這一步其實已經(jīng)接近最終結(jié)果了糖赔,你可以采用同樣的方法將其他兩列的空值進行填充萍丐,或者對多個列同時進行空值填充:df = df[['class_id', 'class_name', 'remark']].fillna(method='ffill')
。
如果你是需求分析中的需求1
放典,那么請繼續(xù)以下步驟逝变。
3.對數(shù)據(jù)進行分組
本步驟需要對沒有合并單元格的列根據(jù)上一步中所使用的列進行分組基茵,并將組內(nèi)的數(shù)據(jù)使用,
連接起來。本例中使用的沒有合并單元格的列是student_list
列壳影」安悖可以看到示例數(shù)據(jù)集已經(jīng)被根據(jù)class_id
分為4組,且各組內(nèi)的student_list
元素已分別被,
連接起來放到一個單元格中宴咧,新生成的 df_student
數(shù)據(jù)集的索引是class_id
根灯。
df_student = df.groupby('class_id').agg({"student_list": ', '.join})
4.去除帶有空值的行
此步需要對原數(shù)據(jù)進行中帶有空值的行去掉,并將student_list
列丟棄掺栅。
丟棄
student_list
列的原因是:在上一步已經(jīng)生成了一個新的數(shù)據(jù)集df_student
烙肺,這個數(shù)據(jù)集中的student_list
列才是我們想要的數(shù)據(jù)
# axis=0 代表去除帶有一個或多個空值的行,對應的 axis=1 代表去除帶有一個或多個空值的列氧卧,本例中我們需要去除帶有空值的行
df = df.dropna(axis=0).drop('student_list', axis=1)
5.合并數(shù)據(jù)集
此步驟將上述步驟中產(chǎn)生的兩個數(shù)據(jù)集df
和df_student
進行合并桃笙,得到最終想要的結(jié)果集。
# 采用 merge() 函數(shù)將 df 和 df_student 根據(jù) class_id 進行左連接合并數(shù)據(jù)
# 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)
補充:數(shù)據(jù)連接示意圖
如果你覺得此文對你有幫助假抄,請記得 點贊 收藏 + 關注 哦