others - Pandas DataFrame: 删除列字符串中不需要的部分

我正在寻找一种有效的方法从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 )

时间:


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

这里有一个bug:目前无法将参数传递给str.lstripstr.rstrip

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

现在可以在dev分支上工作:


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

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

最后一个字符:


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

前两个字符:


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

使用Pandas replace函数,非常简单,功能强大,你可以使用正规表达式。


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

我发现各种方法之间的性能差异非常大(例如,修改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

...