Python3 pandas庫(15) 分列 (上)str.split()
分列在我們日常工作中經常用到。從各種系統中導出的什麼訂單號啊,名稱啊,日期啊有很多都是複合組成的,這些列在匹配、合併時沒有辦法使用,我們經常需要將她們分開。
像下面的DataFrame, 櫃檯號是複合的,櫃檯名稱也是複合的,我們只需要後面一部分,並不需要前綴AAA, BBB, .....
網上搜索了一下,以前的做法是將要分的那列迭代並用split()分開,然後將分開後的數據新建一個DataFrame,然後再與原數據合併。比較複雜,大概的代碼如下:
df2=pd.DataFrame((x.split(-) for x in df[櫃檯名稱]),index=df.index,columns=[區域,店名])
df=pd.merge(df,df2,right_index=True, left_index=True)
其實原理清楚的話也不是很複雜。
當然我這裡還有稍微簡單的辦法,其實原理基本一樣,只是不再使用迭代,只需要 df[櫃檯名稱].str.split(-) 取代 x.split(-) for x in df[櫃檯名稱]
我們看到出來的結果已經有索引和列名,明顯已經是一個DataFrame了。這就是參數expand=True的作用。
在這裡新的DataFrame和原數據df都是使用的默認索引,索引是一致的,可以以索引為鍵,使用merge()合併。如果索引不同的話,就需要重新設置索引了。
最終的代碼只有這麼多:
pd.merge(df, pd.DataFrame(df[櫃檯名稱].str.split(-,expand=True)), how=left, left_index=True, right_index=True)
基本就成功了。
注意:
如果直接用某一列和split()來分列是不行的,因為Series數據類型是沒有split()的。
而如果先用.str將這一列轉換為類似字元串的格式,就能夠使用split()了。
str.split()有三個參數:
第一個參數就是引號里的內容:就是分列的依據。可以是空格,符號,字元串等等。
在上面這個圖裡,使用『2』作為分列依據,含有2的三行就分開了,沒有含2的就沒有分列。這種情況在後面轉換成DataFrame時會出錯。
第二個參數就是前面用到的expand=True,這個參數直接將分列後的結果轉換成DataFrame。
可能有的人會想到一個問題,如果用於分列的依據符號在有多個的話會發生什麼:
在這裡三個A,就分了三次。
第三個參數的n=數字就是限制分列的次數。
分列1次,變成兩列。
分列兩次,變成三列。
如果我想從最右邊的開始找分列的依據,可以使用rsplit()
在這裡三個A是挨在一起的看不出來左右。rsplit和split()的用法類似,一個從右邊開始,一個從左邊開始。
推薦閱讀:
※用例4: CVE-2014-3704
※用Python實現機器學習演算法:線性回歸
※Python從零開始系列連載(18)——Python特色數據類型(列表)(中)
※Python視頻教程,Python學習路線圖林其