【Pandas】群類答疑4:搞定一列拆分多列1(學會找規律)


群里小伙伴問如何一列拆分多列,比如度分秒,提取里面的數字,拆分三列

 

 

先原群主分享的兩種方法: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)

 

這樣拆解是不是清晰很多了,你學會了嗎?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM