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

时间:2015-08-26 14:28:22

标签: python string pandas

设置

我有一个pandas数据框,其中包含一个包含化学同位素符号的'iso'列,例如'4He','16O','197Au'。我想使用annotate()中的matplotlib函数在图上标记许多(但不是全部)同位素。标签格式应具有上标的原子质量。我可以使用LaTeX样式格式化来执行此操作:

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

对于我想要标记的每种同位素,我可以像上面那样写几十个annotate()语句,但我宁愿自动化。

问题

如何从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(),但无法获得预期的效果。

3 个答案:

答案 0 :(得分:3)

这是我使用split的答案。使用的正则表达式可以改进,我在这类事情上非常糟糕: - )

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

答案 1 :(得分:0)

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

#!/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')

答案 2 :(得分:0)

你试过import string for i in list_of_isotopes: Num = df[df.iso==i].iso.str.strip(string.ascii_letters) Sym = df[df.iso==i].iso.str.strip(string.digits) axis.annotate('$^%s$%s' %(Num, Sym), xy=(x[Num], y[Num]), xycoords='data') ,也许你可以考虑一下:

SELECT sub_id, pm_id, COUNT( CASE WHEN `progress`='0' THEN * ELSE NULL END )AS expect,
                      COUNT( CASE WHEN `progress`='100' THEN * ELSE NULL END )AS stretch,
                      COUNT( CASE WHEN `progress`='-100' THEN * ELSE NULL END )AS poor,
                      COUNT( CASE WHEN `progress`='200' THEN * ELSE NULL END )AS excel 
FROM `sub_performancemeasures`
GROUP BY pm_id