群里小伙伴問如何一列拆分多列,比如度分秒,提取里面的數字,拆分三列
先原群主分享的兩種方法:split和extract
下面詳細介紹兩種方法原理:
1、split
split實際支持多次拆分,通過|把拆分條件連接起來,類似正則的或,默認生成list,expand=True可以自動展開為二維數據
像下面這種
你發現沒,最后一列是空數據
如何只要前面三列?
1、寫死:取前三列,假如有多列,這樣寫不靈活(多列不推薦)
2.1、間接取最后一列:利用按行索引提取,結合轉置來實現,於是可以先轉置,輕松去除最后一行,再轉置回去(靈活,多列推薦)
下面是第二種過程
2.2、直接取最后一列:直接按行、列聯合索引提取的函數,df.iloc[:,:-1],不用轉置(感謝群友提供思路)
df.iloc[:,:-1],以分號為界限,左邊是行,右邊是列;這里的意思是選擇全部行,除最后一列的全部列數據(進一步簡化,強烈推薦)
是不是很輕松就解決了
2、extract 正則表達式: 默認列名是0開始的索引,通過 ?P<列名> 重命名列名
可能這里例子比較特殊,expand並不影響最終結果。
最后,再對兩種方法做個小結:
split:拆分會產生空列,需要去除,好在容易理解
extract:通過正則提取,不會產生空列,但對正則要求比較高
下面是直接把拆分結果賦值給列,間接實現一列拆分多列效果
print('-------總結----------') df = pd.DataFrame({'序號':range(1,6), '度分秒':['27°14’24”','33°44’42”','50°35’50”','45°45’00”','72°02’32”']}) df1=df.copy() df1[['度','分','秒']]=df2['度分秒'].str.split('°|’|”',expand=True).T[:-1].T print('split + 間接提取') display(df1) df2=df.copy() df2[['度','分','秒']]=df2['度分秒'].str.split('°|’|”',expand=True).iloc[:,:-1] print('split + 直接提取') display(df2) df3=df.copy() df3[['度','分','秒']]=df1['度分秒'].str.extract(r'(?P<度>\d+)°(?P<分>\d+)’(?P<秒>\d+)”',expand=True) print('extract 正則提取') display(df3)
這樣拆解是不是清晰很多了,你學會了嗎?