2014-04-18 22 views
7

Tôi hơi bối rối với kiểu dữ liệu "đối tượng" trong Pandas. Chính xác "đối tượng" là gì?Chuyển đổi Float thành Chuỗi trong Pandas

Tôi muốn thay đổi biến "SpT" (xem bên dưới) từ đối tượng thành Chuỗi.

> 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 

Đối với điều này tôi thực hiện như sau:

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

Nhưng điều đó không có hiệu lực thi hành dtype của SPT.

Lý do để làm là khi tôi làm như sau:

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] 

tôi nhận được:

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

Do đó, tôi tin rằng nếu tôi chuyển đổi "đối tượng" để "String", tôi sẽ nhận được để làm những gì tôi muốn.

Thông tin thêm: Đây là cách SPT trông giống như:

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' là kiểu gõ chung cho các loại không tách rời, điều này cho thấy cột của bạn đã là một chuỗi và chắc chắn là sau khi chuyển đổi để vấn đề nằm ở hàm – EdChum

+0

Không , chức năng là chính xác. Câu trả lời dưới đây đã giúp tôi. Cảm ơn dù sao đi nữa! – Rohit

+0

@aging_gorrila Bạn đang sử dụng phiên bản gấu trúc nào? –

Trả lời

11

Nếu một cột chứa chuỗi hoặc được coi là chuỗi, nó sẽ có một dtype của object (nhưng không nhất thiết phải đúng ngược - hơn dưới đây) . Dưới đây là một ví dụ đơn giản:

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 

Nếu một cột chỉ chứa các chuỗi, chúng ta có thể áp dụng len vào nó như những gì bạn đã làm nên hoạt động tốt:

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

Tuy nhiên, một dtype của đối tượng không có nghĩa là nó chỉ chứa các chuỗi. Ví dụ: cột strange chứa các đối tượng có loại hỗn hợp - và một số str và một số float. Áp dụng chức năng len sẽ nâng cao một lỗi tương tự như những gì bạn đã thấy:

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

Như vậy, vấn đề có thể là bạn chưa đúng quy đổi cột chuỗi, và cột vẫn chứa các loại đối tượng khác nhau.

Tiếp tục ví dụ trên, chúng ta hãy chuyển đổi strange thành các chuỗi và kiểm tra xem apply công trình:

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

(Có một sự khác biệt đáng ngờ giữa df_cleaneddf_clean có trong câu hỏi của bạn, nó là một lỗi đánh máy hoặc một sai lầm trong các mã gây ra vấn đề?)

+0

Cảm ơn bạn đã làm rõ điều này. Vấn đề là lệnh chuyển đổi "df_cleaned ['SpT'] = df_cleaned ['SpT']. Astype (str)" không có hiệu lực. Tôi tiếp tục gặp lỗi tương tự. Làm cách nào để đảm bảo rằng tất cả 114000 giá trị đã được chuyển đổi thành chuỗi? Có, có một lỗi đánh máy. Tôi sửa nó rồi. – Rohit

+0

Tôi tin rằng '' df_cleaned ['SpT'] = df_cleaned ['SpT']. Astype (str) '' sẽ thực hiện chuyển đổi một cách chính xác. Bạn đang áp dụng chức năng chính xác như được mô tả trong câu hỏi của bạn? –

+0

Duh! Tôi nghiêm túc cần phải chọn tên biến tốt hơn! Những điều này làm tôi bối rối! Có, tôi đã đăng ký sai biến! Cảm ơn ... Tôi cần cà phê! – Rohit

Các vấn đề liên quan