pandasDataFrame:从列中的string中删除不需要的部分

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

数据如下所示:

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) 

任何指针将不胜感激!

 data['result'] = data['result'].map(lambda x: x.lstrip('+-').rstrip('aAbBcC')) 

我会使用pandasreplacefunction,非常简单和强大,你可以使用正则expression式。 下面我使用正则expression式\ D删除任何非数字字符,但显然你可以用正则expression式很有创意。

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

在特定情况下,您知道要从dataframe列中移除的位置数量,可以使用lambda函数内的string索引来摆脱那些部分:

最后的字符:

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

前两个字符:

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

这里有一个错误:目前无法将parameter passing给str.lstripstr.rstrip

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

编辑:2012年12月7日这工作现在在开发分支:

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

我发现在各种方法之间的性能差异很大(即修改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 

一个非常简单的方法是使用extract方法来select所有的数字。 只需提供正则expression式'\d+'提取任意数量的数字。

 df['result'] = df.result.str.extract('(\d+)', expand=True).astype(int) df time result 1 09:00 52 2 10:00 62 3 11:00 44 4 12:00 30 5 13:00 110 
 =RIGHT(LEFT(O13,(LEN(O13)-1)),LEN(LEFT(O13,(LEN(O13)-1))-1)) 

把这个结果列的权利,并得到结果。