使用pandas将字符串拆分为数字和文本

2024-05-20 22:46:35 发布

您现在位置:Python中文网/ 问答频道 /正文

设置

我有一个pandas数据框,其中包含一列“iso”,其中包含化学同位素符号,如“4He”、“16O”、“197Au”。我想使用matplotlib中的annotate()函数在绘图上标记许多(但不是所有)同位素。标签格式应具有上标中的原子质量。我可以使用乳胶样式的格式:

axis.annotate('$^{4}$He', xy=(x, y), xycoords='data')

我可以为我想标记的每一种同位素写几十条类似上面的语句,但我宁愿自动化。

问题

如何从iso列中提取同位素编号和名称?

把那些碎片提取出来,我就可以做标签了。假设我们将它们转储到变量NumSym中。现在我可以循环我的同位素做如下的事情:

for i in list_of_isotopes:
  (Num, Sym) = df[df.iso==i].iso.str.MISSING_STRING_METHOD(???)
  axis.annotate('$^{%s}$%s' %(Num, Sym), xy=(x[Num], y[Num]), xycoords='data')

大概,有一个pandas字符串方法可以放在上面。但我很难想出解决办法。我一直在尝试split()extract()几种不同的模式,但是没有得到理想的效果。


Tags: 数据标记pandasdfdata格式iso标签
3条回答

要提取同位素符号的数字和元素,可以将regular expression(short:regex)与Python的^{}模块结合使用。regex查找数字,然后查找使用组名称分组并可访问的字符。如果regex匹配,则可以提取数据并^{}所需的注释字符串:

#!/usr/bin/env python3
# coding: utf-8

import re

iso_num = '16O'

preg = re.compile('^(?P<num>[0-9]*)(?P<element>[A-Za-z]*)$')
m = preg.match(iso_num)

if m:
    num = m.group('num')
    element = m.group('element')

    note = '$^{}${}'.format(num, element)

    # axis.annotate(note, xy=(x, y), xycoords='data')

我会使用简单的字符串操作,而不需要regex的麻烦。

isotopes = ['4He', '16O', '197Au']
def get_num(isotope):
    return filter(str.isdigit, isotope)

def get_sym(isotope):
    return isotope.replace(get_num(isotope),'')

def get_num_sym(isotope):
    return (get_num(isotope),get_sym(isotope))


for isotope in isotopes:
    num,sym = get_num_sym(isotope)
    print num,sym

这是我使用split的答案。使用的regexp是可以改进的,我很不擅长那种东西:-)

df = pd.DataFrame({'iso': ['4He', '16O', '197Au']})
result = df['iso'].str.split('(\d+)([A-Za-z]+)', expand=True)
result = result.loc[:,[1,2]]
result.rename(columns={1:'x', 2:'y'}, inplace=True)
print(result)

产生

     x   y
0    4  He
1   16   O
2  197  Au

相关问题 更多 >