熟讀 Python 基本資料結構,但實際應用時卻大腦短路,無法解決問題?
熟悉 pandas ,但遇到沒有內建的方法,就不知所措?
如果你有這種情況,那麼你缺少的是解決問題的思路。
經常向我提問的同學應該知道,我一般不會直接給出程式碼,而是給你提供思路。本系列主打思路,基於同一思路,給出多種不同的解決方案,讓你舉一反三解決問題。
問題有位小夥伴提了一個簡單的問題,資料如下:
我希望把列"key1,2,3"調整到表頭的最左邊,其他的列順序我不關心別讓我把所有列名寫出來,因為我有些表可能有幾十上百的列前提我們需要知道一些前提知識。
pandas 中怎麼指定列順序?非常簡單:
往 df[] 中指定多個列名的 list 即可顯然,提問者就是不希望手工輸入所有的列表pandas 中怎麼獲取表的所有列名:
df.columns 即可。如果希望得到列表,只需要 list(df.columns) 即可如何拼接 Python 中的2個列表:
理解這兩點後,現在的問題其實不是什麼 pandas 或 啥表頭的順序問題,而是一個列表構造問題:
行4:是解決問題的關鍵接下來,基於這些前提條件和思路,看看能做出多少種解法
解法1這是最直接的方式:
行4-7:遍歷所有列,把非目標列名去掉即可如果你不熟悉推導式,也可以用 for in 遍歷
"我不懂啥推導式呀,遍歷也用得不熟悉,有沒有不用遍歷的方式?"
解法2"Python 不是一直聲稱語法簡單嗎,為什麼不可以把 2 個列表相減,就得到剩餘列名?"
這想法還挺有道理的,為什麼不呢?
因為列表中的元素是可以重複的,如果 2 個列表能相減,他就要考慮有重複元素與沒有重複元素的歧義。
因此,列表是不能相減,但是 Python 中的確有一種東西與列表相似,但他裡面的元素不能重複—— set(集)
由此我們可以得到第二種解法:
行4:用 set 函式得到 set 結構,即可相減。為什麼需要在外面再套一個 list 呢?因為下一步我們需要使用 "列表相加" 的騷操作細心的你可能注意到,出來的結果中,其他列的順序與解法1不一樣!
因為 set 是不關心元素順序的,2 個 set 相減後,順序變化了
"有沒有不同遍歷,有可以保留其他列的原始前後順序的?"
解法3前面的解法,本質上都在做去重工作。pandas 中不也有去重功能嗎,我們也可以用上。
行4:pd.Series 中傳入有重複元素的列表,就能返回一個 Series。使用他的去重方法即可完成"有問題啊,new_cols 是列表?,不應該是一個 Series 嗎?為什麼 df[一個Series] 也能改變列順序?"
實際上,df[] 裡面可以接受大多數序列,比如 set 或 numpy 的陣列等等,唯獨元組不行。
這涉及到多層索引的東西,超綱了,可參考 pandas 專欄第3節內容:
思考上面 3 種解法都很好解決了問題,並且解法1和3還能保證其他列的順序不變。
但是,如果目標列 key1,2,3 可能會出現缺失,比如某個表只有 key1 和 key2,那麼今天的 3 種方法都不能執行。
不妨用今天教你的思路,想想怎麼解決這個難題