上一篇忘記說明,在這邊補充這一系列的Pandas是跟著《AI時代的資料科學:小白到數據專家的全面指南》一書中的內容進行學習,目前預想的進度是一篇學習一小個章節。
終於不用傻傻地用for迴圈慢慢做字串處理
以往碰到dataframe中某欄的資料需要對字串或型別進行處理,都是使用for迴圈來做,雖然可以達成目的,但總覺得程式碼中充斥著for迴圈好像哪裡怪怪的。
但其實Pandas中有一些好用、快速且高效的函數可以做到這些事,尤其是在dataframe如果超級大的時候會比for迴圈更有效率。
首先一樣先建立一個dataframe,眼尖一點的話應該會發現這是台積電的資料XD
df = pd.DataFrame(
{
"date": ["114/02/13", "114/02/14", "114/02/17", "114/02/18"],
"price": ["1090.00", "1065.00", "1065.00", "1085.00"],
"change": ["-10", "-30", "+25", "+15"]
}
)
印出來會長這樣:
將字串a取代成字串b
對dataframe中某一欄中的資料進行字串取代,可以使用.str.replace()
這個函數來達成,像是我如果偏好日期的年月日之間不使用符號來連接,那我可以透過以下的程式碼:
df["date"] = df["date"].str.replace(r"\D", "")
replace中的r"\D"
是正則表達式中代表所有非數字的字元,因此這行程式碼的作用是將date欄位的每筆資料中的非數字字元全部替換成空字串,所以像是114/02/13就會變成1140213。然而,我實際執行時卻發現資料完全沒有變化,程式碼檢查了老半天也找不出bug,最後靠著求助chatgpt後終於得到了解答。
在新版的 pandas(例如 1.5 或更高版本)中,str.replace()
默認會將正則表達式中的替換模式視為regex=True
,但這在某些情況下會需要更明確的處理。如果regex=False
(即不使用正則表達式),這樣的替換可能不會生效。
先不論解釋正不正確,反正它確實解決了不能正確取代的問題。因此程式碼變成以下這樣:
df["date"] = df["date"].str.replace(r"\D", "", regex=True)
年/月/日 變成 年月日
如此一來就成功進行了取代。
當然這種簡單的case也能單純地使用str.replace("/", "")
就能達到一樣的效果。
將欄中的資料全部轉換成特定的型別 (type)
很多看上去是數字的資料,其實是以字串 (str)的型別儲存,當要進行運算時就會跳出錯誤,所以對資料進行型別轉換相當常見。
使用astype()來對指定欄中的資料統一進行型別轉換,括號中可以放入想要轉換成的型別。
# 確認change中的資料在轉換前的型別
for data in df["change"]:
print(type(data))
# 將change中的資料型別轉換為int
df["change"] = df["change"].astype("int")
# 確認change中的資料在轉換後的型別
print("\n", "型別轉換後", "\n")
for data_new in df["change"]:
print(type(data_new))
使用astype進行型別轉換前後的差異
從輸出結果得知,原本change中的資料看上去是數字 (-10, -30, +25, +15)但實際上是字串 (str),在使用astype(int)進行型別轉換後變成了整數 (int),將change單獨印出來後可以發現原本的正號消失了(因為平常正數不會特別標示正號)。
進行型別轉換後的df["change"]
果然學程式不能沒有自己實際操作,不然像replace函數不一定會默認正則表達式這種在版本更迭中會有所不同的事根本就不會注意到,今天還因為這個問題卡了1小時。
感謝大家的閱讀!