Pythonda iki değişkene göre gruplamış olduğum veri setindeki son 5 tarihi nasıl filtreleyebilirim?

Benim elimde A ve B değişkene göre gruplandırmış olduğum veriler var. Bu gruplandırmış olduğum verilerin içindeki D sütunundaki tarihleri sıralayıp içlerinden en son 5 tarihi filtrelemek istiyorum. Yani D sütununda gruplamış olduğum değişkenlere dair 5 satır olsun istiyorum. Aggregate fonkisyonlarını denedim fakat olmadı. Bunu farklı bir şekilde nasıl yapabilirim ?

 grouped_multiple = sözleşme_yeni.groupby(['A','B']).agg({'C':'max', 'D' : 'last' , 'E' : 'max'})

Bu tabloyu oluştururken kullandığım kod yukarda E sütunu için last değil last 5 sütunu istiyorum açıkçası bu koda onu entegre edebilirim.

Yardımlarınızı bekliyorum.
Şimdiden teşekkürler :slight_smile:

Merhaba,

Anladığım kadarıyla, satır verileri A sütununa göre gruplara ayrılacak, ayrılan gruplarda yer alan satır verileri B sütununa göre en düşük değerden en yüksek değere göre sıralanacak ve bu düzene göre her bir gruptaki son 5 satır verisinin D sütununu alacaksınız.

Şayet doğru anladıysam, bunun için şöyle bir kod yazabilirsiniz:

print(df.sort_values("B").groupby("A").nth([*range(-5, 0)[::-1]])["D"])

Not: df yerine sizin sözleşme_yeni yazmanız gerekiyor.

Aslında yukarıdaki formu bozmadan D’yi yani tarih sütununu sıralayarak A’ya göre gruplandırmış olduğum verilerin sadece 5 satırını elde etmek istiyorum.

Eklediğim resimde görüldüğü gibi A ve B ye göre gruplandırmış olduğum veri setini bir de D’ye yani tarihe göre sıralayıp her A grubunun 5 satırını almak istiyorum.

Yazdığım kodu çalıştırdınız mı?

Size bir örnek göstereyim:

import pandas as pd

from random import randint
from datetime import (datetime as dt, timedelta as td)


def create_random_date(start: str, end: str):
    d1 = dt.strptime(start, "%Y")
    d2 = dt.strptime(end, "%Y")
    return (
        d1 + td(seconds=randint(1, int((d2 - d1).total_seconds())))
    ).strftime("%Y-%m-%d")


def create_random_data(n: int):
    return [
        (
            randint(1, 2),
            randint(100, 1000),
            randint(1, 4),
            create_random_date("2010", "2020"),
            randint(10000, 100000)
        ) for _ in range(n)
    ]


df = pd.DataFrame(
    data=create_random_data(n=100),
    columns=["A", "B", "C", "D", "E"]
)
print(df)

Bu yukarıdaki kodu çalıştırdığım zaman aşağıdaki bir çıktı alıyorum. Bu tablo az çok sizin tablonuzu temsil ediyor.
Çıktı:

    A    B  C           D      E
0   1  902  1  2010-07-23  50954
1   2  813  2  2018-09-20  80304
2   1  487  2  2017-02-27  57535
3   2  133  1  2011-02-03  67446
4   1  576  3  2015-12-20  47928
.. ..  ... ..         ...    ...
95  1  963  1  2019-08-11  21941
96  1  384  4  2019-07-14  81718
97  2  643  3  2018-11-20  66676
98  2  331  1  2013-10-15  42971
99  2  461  1  2013-08-19  64459

[100 rows x 5 columns]

Aşağıdaki kodlar ile hem tabloyu A sütununa göre gruplandırmış, hem de her bir grubu B sütununa göre küçükten büyüğe sıralamış oluruz.

Bu sıralamadaki ilk 5 satıra ait değerler şöyle bulunur:

print(df.sort_values("B").groupby("A").nth([*range(5)]))

Çıktı:

     B  C           D      E
A                           
1  180  4  2013-10-15  36677
1  182  1  2017-09-19  96873
1  187  4  2019-12-23  66581
1  219  1  2018-09-28  26142
1  228  1  2019-02-28  13743
2  111  3  2013-01-28  22649
2  116  1  2012-11-07  53078
2  133  1  2011-02-03  67446
2  144  3  2011-11-06  89085
2  151  1  2016-05-18  83960

Sıralamanın son 5 satırına ait değerler de şöyle bulunabilir:

print(df.sort_values("B").groupby("A").nth([*range(-5, 0)[::-1]]))

Çıktı:

     B  C           D      E
A                           
1  933  2  2016-04-09  99399
1  947  1  2010-06-22  16959
1  958  2  2010-03-03  82389
1  963  1  2019-08-11  21941
1  981  4  2019-12-03  13028
2  843  4  2017-07-04  61499
2  894  4  2018-04-07  45054
2  919  2  2016-03-30  85167
2  934  4  2010-06-18  18215
2  949  3  2011-04-28  92185

Özetle, gruplandırmayı A sütununa göre yapabilirsiniz, çünkü A sütununda iki tip değer var. B sütunundaki değerler birbirlerinden çok farklı olduğu için, buradaki değerleri gruplandırmak yerine sıralayabilirsiniz. Daha sonra her bir grup için ilk n veya son n satırdaki değerleri alabilirsiniz. Yukarıdaki örnekte her bir grubun ilk beş ile son beş satırdaki değerleri ekrana yazdırıldı.

2 Beğeni

Çok teşekkür ederim sayenizde istediğime ulaşabildim.