我有以下数据框:
contract
0 WTX1518X22
1 WTX1518X20.5
2 WTX1518X19
3 WTX1518X15.5
我需要添加一个新列,其中包含第一列中最后一个'X'之后的所有内容。结果将是:
contract result
0 WTX1518X22 22
1 WTX1518X20.5 20.5
2 WTX1518X19 19
3 WTX1518X15.5 15.5
所以我想我首先需要找到最后一个'X'的字符串索引位置(因为字符串中可能有多个'X')。然后得到一个子字符串,其中包含每行索引位置之后的所有内容。
编辑:
我已设法根据需要获取“X”的索引位置:
df.['index_pos'] = df['contract'].str.rfind('X', start=0, end=None)
但我仍然无法获得包含“X”后面所有字符的新列。我在尝试:
df['index_pos'] = df['index_pos'].convert_objects(convert_numeric=True)
df['result'] = df['contract'].str[df['index_pos']:]
但这只是给我一个名为'result'的空列。这很奇怪,因为如果我执行以下操作,那么它可以正常工作:
df['result'] = df['contract'].str[8:]
所以我只需要一种不硬编码'8'的方法,而是使用'index_pos'列。有什么建议吗?
答案 0 :(得分:3)
使用vectorised str.split
拆分字符串并将最后一次拆分投射到float
:
In [10]:
df['result'] = df['contract'].str.split('X').str[-1].astype(float)
df
Out[10]:
contract result
0 WTX1518X22 22.0
1 WTX1518X20.5 20.5
2 WTX1518X19 19.0
3 WTX1518X15.5 15.5
答案 1 :(得分:0)
import pandas as pd
import re as re
df['result'] = df['contract'].map(lambda x:float(re.findall('([0-9\.]+)$',x)[0]))
Out[34]:
contract result
0 WTX1518X22 22.0
1 WTX1518X20.5 20.5
2 WTX1518X19 19.0
3 WTX1518X15.5 15.5
EdChump使用正则表达式的类似方法,这个只假设数字位于字符串的末尾。