我正在寻找一种有效的方法,从DataFrame列中的字符串中删除不需要的部分。

数据如下所示:

    time    result
1    09:00   +52A
2    10:00   +62B
3    11:00   +44a
4    12:00   +30b
5    13:00   -110a

我需要修剪这些数据:

    time    result
1    09:00   52
2    10:00   62
3    11:00   44
4    12:00   30
5    13:00   110

我尝试了.str.lstrip('+-')和.str.rstrip('aAbBcC'),但得到一个错误:

TypeError: wrapper() takes exactly 1 argument (2 given)

任何建议都将非常感激!


当前回答

对于这些类型的任务,我经常使用列表推导式,因为它们通常更快。

在做这样的事情(即修改DataFrame中一个系列的每个元素)的各种方法之间,性能可能会有很大的差异。通常,列表理解是最快的——参见下面的代码竞赛:

import pandas as pd
#Map
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']})
%timeit data['result'] = data['result'].map(lambda x: x.lstrip('+-').rstrip('aAbBcC'))
10000 loops, best of 3: 187 µs per loop
#List comprehension
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']})
%timeit data['result'] = [x.lstrip('+-').rstrip('aAbBcC') for x in data['result']]
10000 loops, best of 3: 117 µs per loop
#.str
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']})
%timeit data['result'] = data['result'].str.lstrip('+-').str.rstrip('aAbBcC')
1000 loops, best of 3: 336 µs per loop

其他回答

在特定的情况下,你知道你想要从dataframe列中删除的位置的数量,你可以在lambda函数中使用字符串索引来摆脱这些部分:

最后一个字符:

data['result'] = data['result'].map(lambda x: str(x)[:-1])

前两个字符:

data['result'] = data['result'].map(lambda x: str(x)[2:])

这里有一个错误:当前不能将参数传递给str.lstrip和str.rstrip:

http://github.com/pydata/pandas/issues/2411

编辑:2012-12-07这工作现在在开发分支:

In [8]: df['result'].str.lstrip('+-').str.rstrip('aAbBcC')
Out[8]: 
1     52
2     62
3     44
4     30
5    110
Name: result
data['result'] = data['result'].map(lambda x: x.lstrip('+-').rstrip('aAbBcC'))

尝试使用正则表达式:

import re
data['result'] = data['result'].map(lambda x: re.sub('[-+A-Za-z]',x)

我会使用pandas替换函数,非常简单和强大,就像你可以使用regex一样。下面我将使用regex \D删除任何非数字字符,但显然你可以使用regex获得相当有创意的效果。

data['result'].replace(regex=True,inplace=True,to_replace=r'\D',value=r'')