2013-04-22 42 views
9

Tôi có một khung dữ liệu trải dài vài năm và tại một số thời điểm họ đã thay đổi mã cho dân tộc. Vì vậy, tôi cần phải recode các giá trị có điều kiện trong năm - đó là một cột trong cùng một dataframe. Ví dụ 1-3, 2-3, 3-4 và vân vân:Thay thế có điều kiện trong gấu trúc

old = [1, 2, 3, 4, 5, 91] 
new = [3, 3, 4, 2, 1, 6] 

Và điều này chỉ được thực hiện trong những năm 1996 đến 2001. Các giá trị cho các năm khác trong cùng một cột (dân tộc) phải không được thay đổi. Hy vọng tránh quá nhiều vòng không hiệu quả, tôi đã thử:

recode_years = range(1996,2002) 
    for year in recode_years: 
     df['ethnicity'][df.year==year].replace(old, new, inplace=True) 

Nhưng giá trị ban đầu trong khung dữ liệu không thay đổi. Phương thức thay thế được thay thế và trả về các giá trị mới một cách chính xác, nhưng tùy chọn tại chỗ dường như không ảnh hưởng đến khung dữ liệu ban đầu khi áp dụng điều kiện. Điều này có thể là hiển nhiên đối với người dùng Pandas có kinh nghiệm, nhưng chắc chắn phải có một số cách đơn giản để làm điều này thay vì lặp qua tất cả các yếu tố singel?

Chỉnh sửa (x2): cô là một một ví dụ về cách tiếp cận khác mà cũng không làm việc ('Chiều dài thay thế phải bằng chiều dài loạt' và "Lỗi Loại: mảng có thể không được an toàn đúc để loại yêu cầu"):

oldNewMap = {1:2, 2:3} 
df2 = DataFrame({"year":[2000,2000,2000,2001,2001,2001],"ethnicity":[1,2,1,2,3,1]}) 
df2['ethnicity'][df2.year==2000] = df2['ethnicity'][df2.year==2000].map(oldNewMap) 

Chỉnh sửa: Có vẻ như có sự cố cụ thể đối với cài đặt/phiên bản vì nó hoạt động tốt trên máy tính khác của tôi.

Trả lời

10

Nó chỉ có thể được đơn giản để làm điều đó theo một cách khác:

oldNewMap = {1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 91: 6} 
df['ethnicity'][df.year==year] = df['ethnicity'][df.year==year].map(oldNewMap) 
+0

Cảm ơn bạn! Tôi đã thử điều này và một cái gì đó tương tự, nhưng, tò mò, nó không hoạt động bởi vì Python nói rằng "mảng không thể được an toàn đúc để loại yêu cầu" bởi vì họ có "chiều dài bất bình đẳng." Tuy nhiên, họ không! Chuỗi ở bên phải và bên trái có chiều dài bằng nhau. Có lẽ Panda sử dụng độ dài của toàn bộ khung dữ liệu chứ không phải chuỗi được tạo khi cắt bằng cú pháp kiểu np? – hmelberg

+0

@ user2040900: Nó hoạt động cho tôi. Phiên bản nào của Pandas bạn đang sử dụng? Bạn có thể chỉnh sửa câu hỏi của mình để hiển thị ví dụ về những gì sẽ xảy ra khi bạn thử điều này không? – BrenBarn

+0

Xem chỉnh sửa chẳng hạn. Python 2.7, Pandas 0.10.1. – hmelberg

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