Değerleri ayarlamak için iloc kullanma [kapalı]


13

Bu hat dataframe ilk 4 satır döndürür combinediçinfeature_a

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

Beklendiği gibi, bu sonraki satır sütun için veri çerçevesinde 2., 4. ve 16. satırları döndürür feature_a:

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

Bu hat için dataframe ilk 4 satır ayarlar feature_aiçin 77.

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

Bu çizgi bir şey yapar. Daha uzun bir listeye uygulandığında daha uzun sürdüğü için bir tür hesaplama gerçekleşiyor.

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

2., 4. ve 16. satırlar, bununla88 işaretlendiğinde ayarlanmamıştır :

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

Bir veri çerçevesindeki bir sütunun satırlarının rastgele bir listesini, büyük bir kodlama yolu kullanmadan bir değere nasıl ayarlayabilirim?

Bu senaryo oldukça basit ve yaygın olmalı.


Bu sadece programlama ile ilgili bir soru (istatistik yok) ve bu nedenle Stack Overflow
Jake Westfall

Minimal tekrarlanabilir bir örnek olmasaydı, bu tür bir soru stackoverflow da konu dışı olurdu
Glen_b -Restate Monica

Yanıtlar:


24

Seçicileri tersine çevirir ve önce sütuna göre seçerseniz, düzgün çalışır:

Kod:

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

Neden?

İlk (çalışmayan yolu) yaptığınızda, veri çerçevesinin bitişik olmayan bir bölümünü seçersiniz. Uyarıyı almış olmalısınız:

DataFrame'den bir dilimin kopyasında bir değer ayarlanmaya çalışıyor. Bunun yerine .loc [row_indexer, col_indexer] = değer kullanmayı deneyin

Belgelerdeki uyarılara bakın: http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

Bunun nedeni iki bağımsız operasyonun gerçekleşmesidir.

  1. combined.iloc[[1,3,15]]yalnızca üç satırlık yeni bir veri çerçevesi oluşturur ve bu çerçeve mutlaka kopyalanır. sonra...
  2. üzerinden bir sütun seçin ["feature_a"]ancak kopyaya karşı seçilir.

Böylece ödev kopyaya gider. Bunu düzeltmenin çeşitli yolları vardır, ancak bu durumda, önce sütunu seçmek, daha sonra atamak için sütunların bölümlerini seçmek daha kolaydır (ve daha ucuzdur).

Test Kodu:

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

Sonuçlar:

    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
Bu işe yarayabilir, ama neden?
Matthew Drury
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.