Tam sayı dizinine göre bir dizi panda serisi / veri çerçevesi seçme


395

Ben neden olarak merak ediyorum df[2]iken, desteklenmez df.ix[2]ve df[2:3]her iki çalışma.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

Ben beklenebilir df[2]aynı şekilde çalışması için df[2:3]Python indeksleme kongre ile tutarlı olması için. İndeksleme satırını tek tamsayı ile desteklememek için bir tasarım nedeni var mı?


4
df.ix[2]çalışmıyor - en azından değilpandas version '0.19.2'
Zahra

9
İndeksleme operatörü aracılığıyla satır ve sütun seçimi arasındaki farkı görmek için [], aşağıda bu cevaba bakınız . Ayrıca ASLA KULLANMAYIN .ix, kullanımdan kaldırıldı
Ted Petrou

Yanıtlar:


551

echoing @HYRY, bkz. yeni dokümanlar 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Burada, .ilocyalnızca tamsayı dizine .loceklemeyi destekleyecek ve yalnızca etiket dizine eklemeyi destekleyecek yeni operatörlerimiz var.

örneğin bu senaryoyu hayal edin

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] yalnızca satırları (etiket konumuna göre) dilimler


7
2. VE 3. VE 4. satırı isteseydiniz ne olurdu?
FaCoffee

1
basitçe indeksleyicilerin bir listesini iletebilirsiniz; dokümanlar yukarıda işaret edilir
Jeff

2
Bu isimler için herhangi bir gerekçe var mı? Bunları hatırlamakta zorlanıyorum çünkü neden ilocsatırlar ve locetiketler olduğundan emin değilim .
kilojoules

3
@kilojoules .iloc, dizindeki sıralarına göre (ör. .iloc[[2]]) "ikinci" satırdır df. Bu satır dizin konumunda olur 4. .locdizin değerlerine göre arar. Belki "iloc" olduğu gibi "i" gibidir A[i]? :)
Jim K.7

1
@Jeff - bu harika çalışıyor, ancak veri çerçevenizdeki bir satırı çoğaltmak df.loc[-1] = df.iloc[[0]]ve eklemek istediğinizde ne olur ? Çerçeve, hata veren ek bir dizin sütunu ile birlikte gelir ValueError: cannot set a row with mismatched columns (bkz. Stackoverflow.com/questions/47340571/… )
Growler

63

DataFrame indeksleme operatörünün temel amacı []sütunları seçmektir.

Dizin oluşturma operatörü bir dize veya tam sayı iletildiğinde, söz konusu ada sahip bir sütun bulmaya ve bir Seri olarak döndürmeye çalışır.

Dolayısıyla, yukarıdaki soruda: df[2]tamsayı değeriyle eşleşen bir sütun adı arar 2. Bu sütun mevcut değil ve bir KeyErroryükseltildi.


DataFrame indeksleme operatörü, dilim gösterimi kullanıldığında satırları seçmek için davranışı tamamen değiştirir

Garip bir şekilde, bir dilim verildiğinde, DataFrame dizinleme operatörü satırları seçer ve bunu tamsayı konumuna veya dizin etiketine göre yapabilir.

df[2:3]

Bu, 2'den 3'e kadar tamsayı konumu olan satırdan başlayarak son öğe hariç olmak üzere dilimlenir. Yani, sadece tek bir satır. Aşağıda, tamsayı konum 6'dan başlayan, ancak her üçüncü satırda 20 içermeyen satırlar seçilmektedir.

df[6:20:3]

DataFrame dizininizde dizeler varsa, dize etiketlerinden oluşan dilimleri de kullanabilirsiniz. Daha fazla ayrıntı için .iloc vs .loc adresindeki bu çözüme bakın .

Neredeyse hiç bu dilim gösterimini, açık ve neredeyse hiç kullanılmadığı için indeksleme operatörü ile kullanmıyorum. Satırlarla dilimlerken, ile sopa .loc/.iloc.


İndxeing operatörünü kullanarak başka bir veri çerçevesine satır eklemeye çalışıyorum, ancak diğer veri çerçevesi boş kalıyor. Neden?
FindOutIslamNow

23

DataFrame'i bir dizi diksiyon olarak düşünebilirsiniz. df[key]tarafından sütun dizini seçmeye çalışın keyve bir Series nesnesi döndürür.

Ancak [] içinde dilimleme satırları dilimler, çünkü bu çok yaygın bir işlemdir.

Ayrıntı için belgeyi okuyabilirsiniz:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


İpucu için teşekkürler. Komik, bu tür şeyler hala zaman zaman pandaları sorgulayan şeydir. Belirli durumlarda davranışa istisnalar ekleyerek, bana göre biraz rahatlık için tutarlılıktan ödün vermek gibi geliyor.
Carl Berger

15

Pandalar tablosuna dizin tabanlı erişimi sağlamak için , tabloyu Numpy dizisine şu şekilde dönüştürmek için numpy.as_array seçeneği de düşünülebilir .

np_df = df.as_matrix()

ve sonra

np_df[i] 

çalışır.


11
çerçevesi indekslerinin ve pandaların sunduğu her şeyin tüm amacını bozan
Fábio Dias

6

Kaynak koduna bir göz atabilirsiniz .

DataFrame_slice()dilimlemek için özel bir işlevi vardır DataFrameve parametrenin axishangi eksenin dilimleneceğini belirlemesine izin verir . __getitem__()İçin DataFramebaşlatırken eksenini ayarlamak vermez _slice(). Böylece _slice()dilimi varsayılan eksen 0 ile dilimleyin.

Size yardımcı olabilecek basit bir deneme yapabilirsiniz:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

böyle veri çerçevesi içinde döngü yapabilirsiniz.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
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.