2013-05-20 16 views
12

Jestem nowy w pandach i próbuję dowiedzieć się, jak przekonwertować wiele kolumn, które są sformatowane jako ciągi do float64. Obecnie robię poniżej, ale wygląda na to, że apply() lub applymap() powinny być w stanie wykonać to zadanie jeszcze bardziej wydajnie ... niestety jestem trochę zbyt młody debiutant, aby dowiedzieć się, jak. Obecnie wartości procentowe są sformatowane jako ciągi jak '15 0,5%”pandy konwertują łańcuchy znaków do wielu kolumn w ramce danych

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

Odpowiedz

11

Począwszy 0.11.1 (wychodzi w tym tygodniu), zastąpić ma nową opcję zastąpić regex, więc to staje się możliwe

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) 

i trochę szybciej

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

Czy możesz mi powiedzieć, w jaki sposób mogę wdrożyć to do specyficznych kolumny? 'df ['Column1']. replace ('%', '', regex = True) .astype ('float')/100' nie działa. – erantdo

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

* * nieco bardziej wydajny w użyciu 'df1.applymap (lambda x: float (X [: - 1]))/100' ... –

1

odpowiadając komentarz w przyjętym odpowiedź: dla określonych kolumn upewnij się, że nie robisz tego w miejscu.

df['Column1'] = df['Column1'].replace('%','',regex=True).astype('float')/100 
Powiązane problemy