我有这样的数据框:
Instru,Name
16834306,INFOSYS18SEP640.50PE
16834306,INFOSYS18SEP640.50PE
16834306,BHEL18SEP52.80CE
16834306,BHEL18SEP52.80CE
16834306,IOCL18SEP640PE
16834306,IOCL18SEP640PE
我想通过从名称列中获取字符串来创建单独的列,如下所示:
Instru,Name,Symbol,Month,SP,Type
16834306,INFOSYS18SEP640.50PE,INFOSYS,18SEP,640.50,PE
16834306,INFOSYS18SEP640.50PE,INFOSYS,18SEP,640.50,PE
16834306,BHEL18SEP52.80CE,BHEL,18SEP,52.80,CE
16834306,BHEL18SEP52.80CE,BHEL,18SEP,52.80,CE
16834306,IOCL18SEP640PE,IOCL,18SEP,640,PE
16834306,IOCL18SEP640PE,IOCL,18SEP,640,PE
注意:对于 SP 列,Decimal 显示为 decimal,int 显示为 int
最佳答案
使用 pandas.Series.str.extract
具有正则表达式模式的命名组
pat = '(?P<Symbol>.*?)(?P<Month>\d{1,2}\w{3})(?P<SP>[\d\.]+)(?P<Type>.*)'
df.join(df.Name.str.extract(pat))
Instru Name Symbol Month SP Type
0 16834306 INFOSYS18SEP640.50PE INFOSYS 18SEP 640.50 PE
1 16834306 INFOSYS18SEP640.50PE INFOSYS 18SEP 640.50 PE
2 16834306 BHEL18SEP52.80CE BHEL 18SEP 52.80 CE
3 16834306 BHEL18SEP52.80CE BHEL 18SEP 52.80 CE
4 16834306 IOCL18SEP640PE IOCL 18SEP 640 PE
5 16834306 IOCL18SEP640PE IOCL 18SEP 640 PE
正则表达式模式的解释
正则表达式是一种有趣的模糊业务,是一种艺术形式。我会解释我做了什么以及为什么。您可以比较我相对于 @jonclements 所做的事情并看到我们都使用相同的方法解决问题,但做出了微妙不同的假设。
-
'(?P<group_name>pattern)'
是一种创建捕获组并将其命名为'group_name'
的方法 -
'(?P<Symbol>.*?)'
抓取所有字符直到下一个捕获组'?'
说不要贪心。 -
'(?P<Month>\d{1,2}\w{3})'
抓取 1 或 2 个数字,然后是 3 个字母。 1 位或 2 位数字的模糊性是我将前一组设置为非贪婪的原因。 -
'(?P<SP>[\d\.]+)'
抓取一位或多位数字或句点。不可否认,这并不是非常优雅,因为它可以抓取'4.2.4.5'
但它应该能完成工作。 -
'(?P<Type>.*)'
播放清理并捕获其余部分。
关于python - 如何从数据框列值创建单独的子字符串列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52223981/