2012-12-03 17 views
61

DataFrame列の文字列から不要な部分を削除する効率的な方法を探しています。私は、これらのデータをトリミングする必要がPandas 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) 

を!

+0

非常に簡単な方法は、 'extract'メソッドを使用することです。 [以下のこの回答](https://stackoverflow.com/a/47107237/3707607)を参照してください。 –

答えて

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

thx!それは動作します。私はまだmap()の周りに自分の心をラップしています。使用するかどうかはわかりません... –

+0

このメソッドはreplace関数でも動作することを嬉しく思います。 – BKay

+0

@eumiro各列を反復処理する場合、どのようにこの結果を適用しますか? – medev21

12

ここにバグがあります:現在str.lstripstr.rstripに引数を渡すことはできません。

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

EDIT:2012年12月7日、これはdevの枝の上に動作するようになりました:

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

それは私のために働くようですが、私はここでsthを逃していますか? –

18

データフレーム列から削除するポジションの数が分かっている特定のケースでは、

最終文字:

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

最初の2つの文字:

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

ジオ座標を8文字((。)、( - )を含む)にトリミングする必要があります.8より小さい場合は、最後に「0」を挿入してすべての座標を8文字にする必要があります。そうする簡単な方法は何ですか? –

+0

私はあなたの問題を完全には理解していませんが、ラムダ関数を "{0:.8f}"のように変更する必要があるかもしれません。format(x) – MonkeyButter

+0

ありがとうございます。簡単な言葉で私は地理座標を持つデータフレームを持っています - 緯度と経度は2つの列として。文字の長さは8文字以上で、最初から8文字しか残さず、( - )と(。)も含めてください。 –

29

私は非常に単純な、機能を置き換えるパンダを使用したいという部分を取り除くためにラムダ関数内で使用する文字列のインデックスあなたが正規表現を使用できるように強力です。私は正規表現\ Dを使用して、すべての非数字文字を削除していますが、明らかに正規表現でかなり創造的になる可能性があります。

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

私はこれを試しても動作しません。私はそれが文字列全体を置き換えるだけでなく、部分文字列部分を置き換えるのではなく動作しているのだろうかと思います。 – bgenchel

+0

@bgenchel - 私はこのメソッドを使用して、pd.Seriesの文字列の一部を置き換えました:replace(regex = True、to_replace = "my_prefix"、value = "new_prefix") '。これは "my_prefixaaa"のような文字列を "new_prefixaaa"に変換します。 – Jakub

5

私は、このようなこと(データフレーム内のシリーズのすべての要素を変更する)のさまざまな方法の間で、パフォーマンスに大きな違いがあることを発見しました。多くの場合、リストの内包は、最速ことができます - 以下のコードのレースを参照してください。

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 
+0

ありがとう、私は本当に誰かがこれらの方法をタイムリーに期待していました。これらは良い解決策の多くです。 – griffinc

-8
=RIGHT(LEFT(O13,(LEN(O13)-1)),LEN(LEFT(O13,(LEN(O13)-1))-1)) 

結果列のこの権利を入れて、その結果を取得します。

3

非常に簡単な方法は、extractメソッドを使用してすべての桁を選択することです。任意の桁数を抽出する正規表現'\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 
関連する問題