2013-05-20 56 views
12

Pandalar ve float64'lere dizeler olarak biçimlendirilmiş birden çok sütunun nasıl dönüştürüleceğini anlamaya çalışıyorum. Şu anda aşağıdakileri yapıyorum, ancak apply() veya applymap() bu görevi daha da verimli bir şekilde gerçekleştirebilmeli gibi görünüyor. Maalesef ne yapacağımı anlamak için bir çaylak çok fazla. Şu değerler '15 .5%'(bu hafta geliyor) 0.11.1 başlayarakpandalar, dizgileri veri çerçevesindeki birden çok sütun için kaydırmaya dönüştürüyor

for column in ['field1', 'field2', 'field3']: 
    data[column] = data[column].str.rstrip('%').astype('float64')/100 

cevap

11

gibi dizeleri olarak biçimlendirilmiş yüzdeler bir regex ile değiştirmek için yeni bir seçeneği vardır değiştirin, bu yüzden bu mümkün olur

In [14]: df = DataFrame('10.0%',index=range(100),columns=range(10)) 

In [15]: df.replace('%','',regex=True).astype('float')/100 
Out[15]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 100 entries, 0 to 99 
Data columns (total 10 columns): 
0 100 non-null values 
1 100 non-null values 
2 100 non-null values 
3 100 non-null values 
4 100 non-null values 
5 100 non-null values 
6 100 non-null values 
7 100 non-null values 
8 100 non-null values 
9 100 non-null values 
dtypes: float64(10) 

Ve kabul yanıtında bir yorum yanıtlayan biraz daha hızlı

In [16]: %timeit df.replace('%','',regex=True).astype('float')/100 
1000 loops, best of 3: 1.16 ms per loop 

In [18]: %timeit df.applymap(lambda x: float(x[:-1]))/100 
1000 loops, best of 3: 1.67 ms per loop 
+1

söyleyebilir misiniz Belirli için bu uygulamaya nasıl kolonlar? df ['Column1']. değiştirin ('%', '', regex = True) .astype ('float')/100' çalışmadı. – erantdo

1
df.applymap(lambda x:float(x.rstrip('%'))/100) 
+1

* hafif * 'df1.applymap kullanmak daha verimli (lambda x: şamandıra (x [: - 1]))/100' ... –

1

:Belirli sütunlar için, bunu yerinde yapmadığınızdan emin olun.

df['Column1'] = df['Column1'].replace('%','',regex=True).astype('float')/100 
İlgili konular