Veri çerçevesindeki son elemanın erişim dizinine


84

Bunun için etrafa bakıyorum ama bulamıyorum (son derece önemsiz olsa da).

Sahip olduğum sorun, bir veri çerçevesinin ilk ve son girdileri için bir sütunun değerini almak istememdir. Ama yaparsam:

df.ix[0]['date']

Alırım:

datetime.datetime(2011, 1, 10, 16, 0)

ama yaparsam:

df[-1:]['date']

Alırım:

myIndex
13         2011-12-20 16:00:00
Name: mydate

farklı bir formatla. İdeal olarak, veri çerçevesinin son indeksinin değerine erişebilmek isterdim, ancak nasıl olduğunu bulamıyorum.

Dizinin değerleri ile bir sütun (IndexCopy) oluşturmaya bile çalıştım ve şunu deneyin:

df.ix[df.tail(1)['IndexCopy']]['mydate']

ancak bu aynı zamanda farklı bir format da verir (çünkü df.tail (1) ['IndexCopy'] basit bir tamsayı çıktı vermez).

Herhangi bir fikir?

Yanıtlar:


134

Eski cevabın yerini şimdi şu şekilde alır .iloc:

>>> df = pd.DataFrame({"date": range(10, 64, 8)})
>>> df.index += 17
>>> df
    date
17    10
18    18
19    26
20    34
21    42
22    50
23    58
>>> df["date"].iloc[0]
10
>>> df["date"].iloc[-1]
58

Kullanımları düşünebildiğim en kısa yol .iget():

>>> df = pd.DataFrame({"date": range(10, 64, 8)})
>>> df.index += 17
>>> df
    date
17    10
18    18
19    26
20    34
21    42
22    50
23    58
>>> df['date'].iget(0)
10
>>> df['date'].iget(-1)
58

Alternatif olarak:

>>> df['date'][df.index[0]]
10
>>> df['date'][df.index[-1]]
58

Bir de .first_valid_index()ve var .last_valid_index(), ancak ekarte etmek isteyip istemediğinize bağlı olarak bunlar sizin istediğiniz NaNşey olmayabilir.

Unutmayın df.ix[0]size ilk vermez, ancak Örneğin 0. tarafından dizine bir, yukarıdaki durumda df.ix[0]üretecektir

>>> df.ix[0]
Traceback (most recent call last):
  File "<ipython-input-489-494245247e87>", line 1, in <module>
    df.ix[0]
[...]
KeyError: 0

Cevabınız için teşekkürler. Bununla birlikte, df.ix [0] 'in ilk indeks 0 olmasa bile, veri çerçevesinin ilk satırını veriyor gibi göründüğü başka bir veri çerçevem ​​var. Özellikle, df.index [0]' in sonucu 0 değil ve yine de df.ix [df.index [0]] ve df.ix [0] aynı sonucu verir. Neden?
elelias

Ben endeksi görmek gerekir, ama ben indeksi sayısal olmayan olduğu için tamsayı ile erişimde bu durumda, şüpheli olabilir bir dizin değil, bir anahtar gibi davranır. Bunun nedeni, eğer istersen ne istediğin konusunda bir belirsizlik olmaması Something(["A", "B", "C"])[1], ama varsa ne istiyorsun Something([1,2,3,4])[1]? İlgili bazı baş ağrılarıyla ilgili belgelerde buradaki çeşitli bölümleri okuyun .
DSM

Bir kayan nokta için df ['xxx'] [df.index [0]] nasıl kullanılır? Bir float 56.7888'im var ve 57 yerine 56'ya dönüştürüldü
lvthillo

1
Çağrı iget()verir 'Series' object has no attribute 'iget'.
Suzana

15

@ Comte'nin cevabı ile dmdip'in cevabının tamsayı olarak bir panda veri çerçevesinin bir satırının Get dizininde birleştirilmesi

df.tail(1).index.item()

size dizinin değerini verir.


Endeksleri olan Not olduğunu değil , her zaman iyi tanımlanmış onlar endeksli-çoklu veya endeksli bekar fark etmez. Veri çerçevelerini indeksler kullanarak değiştirmek, beklenmeyen davranışlara neden olabilir. Çoklu indeksli bir örneğe sahip olacağız, ancak bunun tek indeksli bir durumda da geçerli olduğunu unutmayın .

Sahip olduğumuzu söyle

df = pd.DataFrame({'x':[1,1,3,3], 'y':[3,3,5,5]}, index=[11,11,12,12]).stack()

11  x    1
    y    3
    x    1
    y    3
12  x    3
    y    5              # the index is (12, 'y')
    x    3
    y    5              # the index is also (12, 'y')

df.tail(1).index.item() # gives (12, 'y')

Endeks df[12, "y"]getirileri ile son elemana erişmeye çalışmak

(12, y)    5
(12, y)    5
dtype: int64

Veri çerçevesini dizine göre değiştirmeye çalışırsanız (12, y), bir yerine iki satırı değiştirirsiniz. Bu nedenle, son satırın indeksinin değerine erişmeyi öğrenmiş olsak da, son satırın değerlerini indeksine göre değiştirmek istemeniz iyi bir fikir olmayabilir , çünkü aynı indeksi paylaşan çok sayıda olabilir. df.iloc[-1]Bu durumda son satıra erişmek için kullanmalısınız .

Referans

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.item.html


7
df.tail(1).index 

en okunaklı görünüyor


Bu bir sayı döndürmez ancak: RangeIndex (başlangıç ​​= 6, dur = 7, adım = 1)
alexandergs

5
alex: döndü dan index, start=6son elemanın ofset gösterir. Yani, df.tail(1)son öğeyi alır , vb df["your_column"][6]için son öğe olur your_column(ancak df.last_valid_index()size sadece sayıyı verir)
michael

3

Artık çok geç olabilir index, bir DataFrame'in son dizinini almak için yöntemi kullanıyorum, sonra [-1]son değerleri almak için kullanıyorum :

Örneğin,

df = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
print(f'df:\n{df}\n')

print(f'Index = {df.index}\n')
print(f'Last index = {df.index[-1]}')

Çıktı

df:
     A
0  0.0
1  0.0
2  0.0
3  0.0

Index = RangeIndex(start=0, stop=4, step=1)

Last index = 3

2

Çift köşeli parantezli .iloc istiyorsunuz.

import pandas as pd
df = pd.DataFrame({"date": range(10, 64, 8), "not_date": "fools"})
df.index += 17
df.iloc[[0,-1]][['date']]

.İloc'a bir dizin listesi verirsiniz - özellikle ilk ve son, [0, -1]. Bu, 'tarih' sütununu istediğiniz bir veri çerçevesi döndürür. ['tarih'] size bir dizi ( iğrenç ) verecek ve [['tarih']] size bir veri çerçevesi verecektir.


0

Pandalar, aşağıdakilere izin veren NumPy sözdizimini destekler:

df[len(df) -1:].index[0]
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.