首頁>技術>
前言

熟讀 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 種方法都不能執行

不妨用今天教你的思路,想想怎麼解決這個難題

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 使用Docker快速部署Skywalking