Python 熊猫子串
我有以下数据帧:Python 熊猫子串,python,pandas,Python,Pandas,我有以下数据帧: 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
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'列。有什么建议吗?使用vectoriased拆分字符串,并将最后一次拆分转换为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
与EdChump使用正则表达式的方法类似,这个方法只假设数字在字符串的末尾。我不想听起来像perl的粉丝,但你试过正则表达式吗?像
df这样简单的东西。contract.str.extract(“%X(.*))
可能已经起作用了。
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