2012-12-03 11 views
61

Bir DataFrame sütunundaki dizelerden istenmeyen parçaları kaldırmak için verimli bir yol arıyorum. Ben .str.lstrip('+-') ve denenmişPandalar DataFrame: bir sütundaki dizelerden istenmeyen parçaları kaldırın

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

: Ben bu verileri kırpmak gerek

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

: gibi

Veri görünüyor. Herhangi bir işaretçiler büyük takdir

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

: str.rstrip('aAbBcC') ama bir hata var!

+0

Bunu 'extract' yöntemini kullanarak yapmak için çok basit bir yol var. Bkz. [Aşağıdaki cevap] (https://stackoverflow.com/a/47107237/3707607). –

cevap

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

thx! bu işe yarıyor. Hala benim haritayı() kullanarak, onu ne zaman kullanacağımı ya da kullanamayacağımı bilmiyorum ... –

+0

Bu yöntemin de işlevini yerine getirdiğini görmekten memnun oldum. – BKay

+0

@eumiro Her bir sütunu yinelemek durumunda bu sonucu nasıl uygularsınız? – medev21

12

burada bir hata var: Şu anda str.lstrip ve str.rstrip argümanlar geçemez:

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

DÜZENLEME: 2012/12/07 bu dev şube şimdi çalışır:

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

Benim için çalışıyor gibi görünüyor, ben burada sth eksik miyim? –

18

Veri tabanı sütunundan kaldırmak istediğiniz konum sayısını bildiğiniz özel durumlarda, şunları yapabilirsiniz: Bir lambda işlevi içinde kullanım dize endeksleme o parçaların kurtulmak için:

Son karakter:

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

İlk iki karakter:

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

Coğrafi koordinatları 8 karaktere ((.), (-) dahil) kırpmalı ve 8'den küçükse 8 koordinatlarını yapmak için en sonda '0' eklemem gerekiyor. Bunu yapmanın daha basit yolu nedir? –

+0

Sorununuzu tam olarak anlayamıyorum ama lambda işlevini "{0: .8f}" gibi bir biçime değiştirmeniz gerekebilir. (X) biçimi – MonkeyButter

+0

Yanıt için çok teşekkür ederim. Basit bir deyişle, coğrafi koordinatlara sahip veri çerçevem ​​var - enlem ve boylam iki sütun olarak. Karakterlerin uzunluğu 8 karakterden fazladır ve ilkinden başlayarak (-) ve (.) Öğelerini içermesi gereken sadece 8 karakter tutuyordum. –

29

i fonksiyonunu yerine çok basit panda kullanmayı tercih ediyorum ve regex kullanabilirsiniz güçlü. Aşağıda, herhangi bir rakam olmayan karakteri kaldırmak için regex \ D kullanıyorum ama açıkçası regex ile oldukça yaratıcı alabilirsiniz.

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

Bunu denedim ve işe yaramıyor. Sadece bir dizgeyi değiştirmek yerine yalnızca bir dizgenin yerine geçmek istediğinizde işe yarayıp yaramadığını merak ediyorum. – bgenchel

+0

@bgenchel - Bir dizenin bir kısmını pd.Shop: 'df.loc [:, 'column_a'] olarak değiştirmek için bu yöntemi kullandım. (Regex = True, to_replace =" my_prefix ", value =" new_prefix ") '. Bu, "my_prefixaaa" gibi bir dizgiyi "new_prefixaaa" olarak değiştirir. – Jakub

5

Ben (yani bir DataFrame içinde bir dizi her eleman değiştirme) bu gibi şeyler yapmak için çeşitli yöntemler arasındaki performansı büyük farklılıklar bulduk. Genellikle bir liste anlama hızlı olabilir - Aşağıdaki kod yarışı bakın: Sonuç sütunun bu hakkı koyun

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

Teşekkürler, Birisinin bu yöntemleri zamanladığını umuyordum. Bunlar çok iyi çözümler. – griffinc

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

ve sonuç almak.

3

Tüm sayıları seçmek için extract yöntemini kullanmak çok basit bir yöntem olabilir. Basitçe '\d+' numaralı normal ifadeyi sağlayarak istediğiniz sayıyı çıkartın.

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