2014-09-04 19 views
11

Có cách nào để chuyển đổi các giá trị như '34% 'trực tiếp sang int hoặc float khi sử dụng read_csv trong gấu trúc không? Tôi muốn nó được đọc trực tiếp là 0,34.Chuyển đổi chuỗi phần trăm để thả trong gấu trúc read_csv

Sử dụng này trong read_csv đã không làm việc:

read_csv(..., dtype={'col':np.float}) 

Sau khi tải csv như 'df' này cũng không làm việc với các lỗi "không hợp lệ theo nghĩa đen cho float(): 34%"

df['col'] = df['col'].astype(float) 

tôi đã kết thúc bằng này mà làm việc nhưng hơi dài:

df['col'] = df['col'].apply(lambda x: np.nan if x in ['-'] else x[:-1]).astype(float)/100 

Cảm ơn,

Trả lời

18

Bạn có thể xác định một chức năng tùy chỉnh để chuyển đổi phần trăm của bạn để nổi

In [149]: 
# dummy data 
temp1 = """index col 
113 34% 
122 50% 
123 32% 
301 12%""" 
# custom function taken from https://stackoverflow.com/questions/12432663/what-is-a-clean-way-to-convert-a-string-percent-to-a-float 
def p2f(x): 
    return float(x.strip('%'))/100 
# pass to convertes param as a dict 
df = pd.read_csv(io.StringIO(temp1), sep='\s+',index_col=[0], converters={'col':p2f}) 
df 
Out[149]: 
     col 
index  
113 0.34 
122 0.50 
123 0.32 
301 0.12 
In [150]: 
# check that dtypes really are floats 
df.dtypes 
Out[150]: 
col float64 
dtype: object 

My trăm nổi code đang biếu không của câu trả lời Ashwini của: What is a clean way to convert a string percent to a float?

+1

Rất hữu ích, cảm ơn. Tôi không biết 'người chuyển đổi'. – KieranPC

3

Bạn đã tiến rất gần với df nỗ lực của bạn. Hãy thử thay đổi:

df['col'] = df['col'].astype(float) 

tới:

df['col'] = df['col'].str.rstrip('%').astype('float')/100.0 
#     ^use str funcs to elim '%' ^divide by 100 
# could also be:  .str[:-1].astype(... 

Pandas hỗ trợ khả năng xử lý chuỗi của Python. Chỉ cần đứng trước chuỗi func bạn muốn với .str và xem nếu nó làm những gì bạn cần. (Điều này bao gồm việc cắt chuỗi, dĩ nhiên.)

Ở trên chúng tôi sử dụng .str.rstrip() để loại bỏ dấu phần trăm dấu chấm, sau đó chúng tôi chia mảng thành 100.0 để chuyển đổi từ phần trăm sang giá trị thực. Ví dụ: 45% tương đương 0,45.

Mặc dù .str.rstrip('%') cũng có thể chỉ là .str[:-1], tôi thích để loại bỏ một cách rõ ràng '%' chứ không phải là một cách mù quáng tháo char ngoái, chỉ trong trường hợp ...

Chúc mừng mã hóa!

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