2014-09-01 25 views
21

Tôi muốn đưa một số dữ liệu vào một DataFrame gấu trúc và tôi muốn gán dtypes cho mỗi cột khi nhập. Tôi muốn để có thể làm điều này cho các tập dữ liệu lớn hơn với nhiều cột khác nhau, nhưng, như một ví dụ:Làm thế nào để đặt dtypes theo cột trong gấu trúc DataFrame

myarray = np.random.randint(0,5,size=(2,2)) 
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int]) 
mydf.dtypes 

kết quả trong:

TypeError: data type not understood 

Tôi đã thử một vài phương pháp khác như:

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int}) 

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

Nếu tôi đặt dtype=(float,int), nó áp dụng định dạng nổi cho cả hai cột.

Cuối cùng, tôi muốn chỉ có thể chuyển nó một danh sách các kiểu dữ liệu giống như cách tôi có thể chuyển nó một danh sách các tên cột.

+0

Đối số cho 'dtype' phải là một dtype NumPy hợp lệ (và dtypes có cấu trúc không được hỗ trợ), do đó danh sách hoặc dict sẽ không hoạt động. Một cách có thể là làm astype cho mỗi cột một cách riêng biệt. Hoặc trước tiên hãy tạo một mảng có cấu trúc cứng nhắc và cung cấp mảng này cho DataFrame. – joris

+0

Tôi biết tôi có thể chỉ định từng cá nhân trong một vòng lặp nhưng tôi ngạc nhiên dtype = không đủ linh hoạt để chứa một danh sách. Cảm ơn câu trả lời mặc dù, tốt để có được xác nhận :) – Chris

+2

https://github.com/pydata/pandas/issues/4464 hiện đang là một vấn đề mở cho điều này (nếu bạn muốn làm một yêu cầu kéo sẽ là tuyệt vời) – Jeff

Trả lời

10

Tôi chỉ gặp phải vấn đề này và vấn đề về gấu trúc vẫn mở, vì vậy tôi đăng cách giải quyết của mình. Giả sử df là DataFrame tôi và dtype là một ánh xạ dict tên cột với các loại:

for k, v in dtype.items(): 
    df[k] = df[k].astype(v) 

(lưu ý: sử dụng dtype.iteritems() trong python 2)

Đối với các tài liệu tham khảo:

+1

Ngạc nhiên là họ không có một phương pháp cho điều này trong Pandas Sẽ là một PR tốt Tôi sẽ nghĩ rằng – Chris

+3

Tôi cần phải sử dụng 'cho k, v trong dtype.iteritems():' để làm việc này. – Khris

+0

Điều này có thể được thay đổi thành 'df.astype (dtype)' – DJK

3

Bạn có thể muốn thử đi qua trong một cuốn từ điển của Series đối tượng để các nhà xây dựng DataFrame - nó sẽ cho bạn nhiều cụ thể hơn quyền kiểm soát việc tạo ra, và hy vọng sẽ rõ ràng hơn những gì đang xảy ra. Một phiên bản mẫu (data1 có thể là một mảng vv):

df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'), 
        'column2':pd.Series(data2, dtype='type2')}) 

Và ví dụ với dữ liệu:

df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'), 
        'B':pd.Series([7,8,9], dtype='float')}) 

print (df) 
    A B 
0 1 7.0 
1 2 8.0 
2 3 9.0 

print (df.dtypes) 
A  int32 
B float64 
dtype: object 
Các vấn đề liên quan