Menggunakan iloc untuk menetapkan nilai [tertutup]

13

Baris ini mengembalikan 4 baris pertama dalam kerangka data combineduntukfeature_a

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

Seperti yang diharapkan, baris berikutnya ini mengembalikan baris 2, 4, dan 16 dalam kerangka data untuk kolom feature_a:

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

Baris ini menetapkan 4 baris pertama dalam kerangka data untuk feature_auntuk 77.

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

Baris ini melakukan sesuatu. Beberapa jenis komputasi terjadi karena membutuhkan waktu lebih lama ketika diterapkan pada daftar yang lebih panjang.

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

Baris ke-2, ke-4, dan ke-16 tidak disetel 88saat dicentang dengan ini:

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

Bagaimana saya bisa mengatur daftar baris kolom dataframe secara acak ke nilai tanpa mengambil jalan memutar pengkodean besar-besaran?

Skenario ini sepertinya cukup mudah dan umum.

Doug7
sumber
Ini adalah pertanyaan tentang pemrograman saja (tidak ada statistik) dan karenanya menjadi milik Stack Overflow
Jake Westfall
Tanpa contoh yang dapat direproduksi minimal, pertanyaan semacam ini juga akan keluar dari topik tentang stackoverflow
Glen_b -Reinstate Monica

Jawaban:

24

Jika Anda membalik pemilih, dan memilih berdasarkan kolom terlebih dahulu, itu akan berfungsi dengan baik:

Kode:

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

Mengapa?

Ketika Anda melakukan yang pertama (cara tidak bekerja) Anda memilih bagian yang tidak berdekatan dari kerangka data. Anda seharusnya menerima peringatan:

Nilai berusaha ditetapkan pada salinan irisan dari DataFrame. Coba gunakan .loc [row_indexer, col_indexer] = nilai sebagai gantinya

Lihat peringatan dalam dokumentasi: http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

Ini karena ada dua operasi independen yang terjadi.

  1. combined.iloc[[1,3,15]]membuat bingkai data baru hanya tiga baris, dan frame harus disalin. kemudian...
  2. pilih satu kolom melalui ["feature_a"]tetapi dipilih terhadap salinan.

Jadi penugasannya disalin. Ada berbagai cara untuk memperbaikinya, tetapi dalam hal ini, lebih mudah (dan lebih murah) untuk memilih kolom terlebih dahulu, lalu pilih bagian kolom untuk penugasan.

Kode Tes:

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

Hasil:

    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
Stephen Rauch
sumber
1
Ini mungkin berhasil, tetapi mengapa?
Matthew Drury