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.lstrip
和str.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))
把这个结果列的权利,并得到结果。