2015-09-15 17 views
21

Tôi đang nhập một tệp excel vào một khung dữ liệu gấu trúc với hàm pandas.read_excel().pandas Python: cách xác định loại dữ liệu khi đọc tệp Excel?

Một trong các cột là khóa chính của bảng: đó là tất cả các số, nhưng nó được lưu dưới dạng văn bản (hình tam giác nhỏ màu xanh ở phía trên cùng bên trái của ô Excel xác nhận điều này).

Tuy nhiên, khi tôi nhập tệp vào khung dữ liệu gấu trúc, cột được nhập dưới dạng phao. Điều này có nghĩa là, ví dụ: '0614' sẽ trở thành 614.

Có cách nào để chỉ định loại dữ liệu khi nhập một cột không? Tôi hiểu điều này là có thể khi nhập tệp CSV nhưng không thể tìm thấy bất kỳ điều gì theo cú pháp của read_excel(). Giải pháp duy nhất tôi có thể nghĩ là thêm một chữ cái tùy ý ở đầu văn bản (chuyển đổi '0614' thành 'A0614') trong Excel, để đảm bảo cột được nhập dưới dạng văn bản và sau đó cắt bỏ 'A' trong python, vì vậy tôi có thể so khớp nó với các bảng khác mà tôi đang nhập từ SQL.

Trả lời

39

Bạn chỉ cần chỉ định trình chuyển đổi. Tôi đã tạo một bảng tính excel của cấu trúc sau:

names ages 
bob  05 
tom  4 
suzy 3 

Trường hợp cột "tuổi" được định dạng dưới dạng chuỗi. Để tải:

import pandas as pd 

df = pd.read_excel('Book1.xlsx',sheetname='Sheet1',header=0,converters={'names':str,'ages':str}) 
>>> df 
     names ages 
    0 bob 05 
    1 tom 4 
    2 suzy 3 
+0

Tôi đã hiểu 'người chuyển đổi' đã chỉ định một hàm để áp dụng cho cột. rõ ràng tôi đã sai - cảm ơn bạn đã chỉ ra điều này, nó rất hữu ích! –

+1

Tôi có thể tìm danh sách các chức năng chuyển đổi được phép ở đâu? Tôi thấy 'str' ở đây, nhưng có lẽ có' int' và một vài chi tiết bên cạnh - là có một liên kết bất cứ nơi nào để các tài liệu nguồn liệt kê các chức năng chuyển đổi có thể có sẵn? –

+1

Tôi chưa tìm thấy danh sách. Vì "trình biến đổi" chấp nhận các chức năng, tôi nghi ngờ rằng trí tưởng tượng của bạn là giới hạn, chỉ để bạn giữ trong giới hạn của chức năng "chuyển đổi" (tức là nó được thiết kế để sử dụng các hàm chỉ yêu cầu một biến đầu vào!). – tnknepp

8

Hàm read_excel() có đối số chuyển đổi, nơi bạn có thể áp dụng các hàm để nhập vào một số cột nhất định. Bạn có thể sử dụng điều này để giữ chúng như là chuỗi. Documentation:

Nguyên tắc chức năng để chuyển đổi giá trị trong một số cột nhất định. Phím có thể là số nguyên hoặc nhãn cột, giá trị là các hàm lấy một đối số đầu vào, nội dung ô Excel và trả lại nội dung được chuyển đổi. đang

Ví dụ:

pandas.read_excel(my_file, converters = {my_str_column: str}) 
+0

Nếu chúng tôi không biết số lượng cột có trong trang tính, có cách nào áp dụng cho mỗi cột trong khi đọc không? – Tango

+6

Nhận giải pháp: 'chuyển đổi = {col: str cho col trong cột_list} df = pd.read_excel ('some_excelfile.xls', converters = converters)' – Tango

6

Bắt đầu với v0.20.0, lập luận dtype từ khóa trong read_excel() chức năng có thể được sử dụng để xác định kiểu dữ liệu mà cần phải được áp dụng cho các cột giống như nó tồn tại cho read_csv() trường hợp .

Sử dụng các đối số convertersdtype cùng nhau trên cùng một tên cột sẽ dẫn đến thứ hai bị bóng mờ và ưu tiên tăng cũ.


1) Inorder cho nó không giải thích dtypes mà vượt qua tất cả các nội dung của nó là cột như họ đã được ban trong file trước đó, chúng ta có thể thiết lập arg này để str hoặc object để chúng tôi làm không làm hỏng dữ liệu của chúng tôi. (Một trường hợp như vậy sẽ được dẫn zeros trong số đó sẽ bị mất bằng cách khác)

pd.read_excel('file_name.xlsx', dtype=str)   # (or) dtype=object 

2) Nó thậm chí hỗ trợ một ánh xạ dict trong đó keys tạo thành tên cột và values đó là kiểu dữ liệu tương ứng được thiết lập đặc biệt là khi bạn muốn thay đổi dtype cho một tập con của tất cả các cột.

# Assuming data types for `a` and `b` columns to be altered 
pd.read_excel('file_name.xlsx', dtype={'a': np.float64, 'b': np.int32}) 
+0

phương thức 'read_excel' không chấp nhận tham số' dtype'. –

1

Trong trường hợp nếu bạn không nhận thức được số lượng và tên của cột trong dataframe sau đó phương pháp này có thể có ích:

column_list = [] 
df_column = pd.read_excel(file_name, 'Sheet1').columns 
for i in df_column: 
    column_list.append(i) 
converter = {col: str for col in column_list} 
df_actual = pd.read_excel(file_name, converters=converter) 

nơi column_list là danh sách các tên cột của bạn.

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