我有一个pandas
数据框,其中包含一个包含化学同位素符号的'iso'列,例如'4He','16O','197Au'。我想使用annotate()
中的matplotlib
函数在图上标记许多(但不是全部)同位素。标签格式应具有上标的原子质量。我可以使用LaTeX样式格式化来执行此操作:
axis.annotate('$^{4}$He', xy=(x, y), xycoords='data')
对于我想要标记的每种同位素,我可以像上面那样写几十个annotate()
语句,但我宁愿自动化。
如何从iso色谱柱中提取同位素数和名称?
通过提取这些碎片,我可以制作标签。假设我们将它们转储到变量Num
和Sym
中。现在我可以循环我的同位素并做这样的事情:
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()
,但无法获得预期的效果。
答案 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