2014-04-18 14 views
7

Jestem trochę zdezorientowany typem danych w Pandach. Czym dokładnie jest "obiekt"?Konwertuj Float na String w pandach

Chciałbym zmienić zmienną "SpT" (patrz poniżej) z obiektu na String.

> df_cleaned.dtypes 
    Vmag  float64 
    RA   float64 
    DE   float64 
    Plx   float64 
    pmRA  float64 
    pmDE  float64 
    B-V   float64 
    SpT   object 
    M_V   float64 
    distance float64 
    dtype: object 

Do tego należy wykonać następujące czynności:

df_cleaned['SpT'] = df_cleaned['SpT'].astype(str) 

Ale to nie ma żadnego wpływu na dtype SPT.

Powodem robi to kiedy należy wykonać następujące czynności:

f = lambda s: (len(s) >= 2) and (s[0].isalpha()) and (s[1].isdigit()) 
i = df_cleaned['SpT'].apply(f) 
df_cleaned = df_cleaned[i] 

uzyskać:

TypeError: object of type 'float' has no len() 

Stąd uważam, jeśli przekonwertować "obiektu" na "String", ja dostanie robić to, co chcę.

Więcej info: Jest to, jak wygląda SPT:

HIP 
1    F5 
2    K3V 
3    B9 
4    F0V 
5    G8III 
6    M0V: 
7    G0 
8  M6e-M8.5e Tc 
9    G5 
10    F6V 
11    A2 
12   K4III 
13   K0III 
14    K0 
15    K2 
... 
118307 M2III: 
118308  K: 
118309  A2 
118310  K5 
118312  G5 
118313  F0 
118314  K0 
118315  K0III 
118316  F2 
118317  F8 
118318  K2 
118319  G2V 
118320  K0 
118321  G5V 
118322  B9IV 
Name: SpT, Length: 114472, dtype: object 
+0

'Dtype' jest typowym numpy dtype dla typów nie integralnych, to sugeruje, że twoja kolumna jest już ciągiem znaków i na pewno jest po konwersji, więc problem leży w twojej funkcji – EdChum

+0

Nie , funkcja jest poprawna. Poniższa odpowiedź pomogła mi. Mimo to dziękuję! – Rohit

+0

@aging_gorrila Jaką wersję pandy używasz? –

Odpowiedz

11

Jeśli kolumna zawiera ciąg lub jest traktowany jako ciąg znaków, będzie to miało dtype z object (ale niekoniecznie prawdziwe tyłu - więcej poniżej) . Oto prosty przykład:

import pandas as pd 
df = pd.DataFrame({'SpT': ['string1', 'string2', 'string3'], 
        'num': ['0.1', '0.2', '0.3'], 
        'strange': ['0.1', '0.2', 0.3]}) 
print df.dtypes 
#SpT  object 
#num  object 
#strange object 
#dtype: object 

Jeśli kolumna zawiera tylko ciągi, możemy zastosować len na nim jak co zrobiłeś powinny działać prawidłowo:

print df['num'].apply(lambda x: len(x)) 
#0 3 
#1 3 
#2 3 

Jednak dtype obiektu nie oznacza zawiera tylko ciągi. Na przykład kolumna strange zawiera obiekty o mieszanych typach - oraz niektóre o numerach str i . Stosując funkcję len podniesie błąd podobny do tego, co widzieliśmy:

print df['strange'].apply(lambda x: len(x)) 
# TypeError: object of type 'float' has no len() 

Zatem, problemem może być to, że nie zostały prawidłowo przekształcone kolumnę do łańcucha, a kolumna zawiera jeszcze mieszane typy obiektów.

Kontynuując powyższy przykład, niech nam konwertować strange do strun i sprawdzić, czy apply utwory:

df['strange'] = df['strange'].astype(str) 
print df['strange'].apply(lambda x: len(x)) 
#0 3 
#1 3 
#2 3 

(Jest podejrzana rozbieżność między df_cleaned i df_clean tam w swoim pytaniu, jest to literówka czy błąd w kodzie, który powoduje problem?)

+0

Dzięki za wyjaśnienie tego. Chodzi o to, że polecenie konwersji "df_cleaned ['SpT'] = df_cleaned ['SpT']. Astype (str)" nie ma żadnego efektu. Nadal dostaję ten sam błąd. Jak mogę przekonwertować wszystkie 114000 wartości na ciąg? Tak, jest literówka. Poprawiłem to. – Rohit

+0

Wierzę, że '' df_cleaned ['SpT'] = df_cleaned ['SpT']. Astype (str) '' zrobił poprawnie konwersję. Czy stosujesz dokładną funkcję opisaną w pytaniu? –

+0

Duh! Poważnie muszę wybrać lepsze nazwy zmiennych! Te mylić nawet siebie! Tak, aplikowałem do niewłaściwej zmiennej! Dzięki ... Potrzebuję kawy! – Rohit

Powiązane problemy