群里小伙伴问如何一列拆分多列,比如度分秒,提取里面的数字,拆分三列
先原群主分享的两种方法: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)
这样拆解是不是清晰很多了,你学会了吗?