【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)

这样拆解是不是清晰很多了,你学会了吗?

------------------------------- ********厚德达理,励志勤工******** -------------------------------
原文地址:https://www.cnblogs.com/hightech/p/13909160.html