Sử dụng iloc để đặt giá trị [đã đóng]


13

Dòng này trả về 4 hàng đầu tiên trong khung dữ liệu combinedchofeature_a

combined.iloc[0:4]["feature_a"]

Như mong đợi, dòng tiếp theo này trả về các hàng thứ 2, 4 và 16 trong khung dữ liệu cho cột feature_a:

combined.iloc[[1,3,15]]["feature_a"]

Dòng này đặt ra 4 hàng đầu tiên trong dataframe cho feature_atới 77.

combined.iloc[0:4]["feature_a"] = 77

Dòng này làm một cái gì đó. Một số tính toán đang diễn ra vì mất nhiều thời gian hơn khi áp dụng vào danh sách dài hơn.

combined.iloc[[1,3,15]]["feature_a"] = 88

Các hàng thứ 2, 4 và 16 không được đặt thành 88khi được chọn với mục này:

combined.iloc[[1,3,15]]["feature_a"]

Làm cách nào tôi có thể đặt danh sách các hàng của một cột của khung dữ liệu thành một giá trị tùy ý mà không mất một đường vòng mã hóa lớn?

Kịch bản này có vẻ như khá đơn giản và phổ biến.


Đây là một câu hỏi về chỉ lập trình (không có số liệu thống kê) và do đó thuộc về Stack Overflow
Jake Westfall

Nếu không có một ví dụ có thể lặp lại tối thiểu, loại câu hỏi này cũng sẽ lạc đề về stackoverflow
Glen_b -Reinstate Monica

Câu trả lời:


24

Nếu bạn đảo ngược các bộ chọn và chọn theo cột trước, nó sẽ hoạt động tốt:

Mã số:

df.feature_a.iloc[[1, 3, 15]] = 88

Tại sao?

Khi bạn thực hiện lần đầu tiên (cách không làm việc), bạn đang chọn một phần không liền kề của khung dữ liệu. Bạn sẽ nhận được cảnh báo:

Một giá trị đang cố gắng được đặt trên một bản sao của một lát cắt từ DataFrame. Thay vào đó, hãy thử sử dụng .loc [row_indexer, col_indexer] = value

Xem các cảnh báo trong tài liệu: http://pandas.pydata.org/pandas- > docs / ổn định / indexing.html # indexing-view-vs.-copy

Điều này là do có hai hoạt động độc lập đang diễn ra.

  1. combined.iloc[[1,3,15]]tạo một khung dữ liệu mới chỉ có ba hàng và khung nhất thiết phải được sao chép. sau đó...
  2. chọn một cột thông qua ["feature_a"]nhưng nó được chọn đối với bản sao.

Vì vậy, nhiệm vụ đi đến bản sao. Có nhiều cách khác nhau để khắc phục điều này, nhưng trong trường hợp này, việc chọn cột trước sẽ dễ dàng hơn (và rẻ hơn), sau đó chọn các phần của cột để gán.

Mã kiểm tra:

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

Các kết quả:

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0

1
Điều này có thể làm việc, nhưng tại sao?
Matthew Drury
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.