Saya mencoba membuat kamus fungsi lambda secara dinamis untuk masuk ke fungsi agg() di Pandas dan menghitung jumlah "anomali".

    def prepareAggDict(defDict):
       aggdict={}  

       # iterate over features with upper limit threshold 
       for feature_a, threshold_a in defDict.items():
           aggdict[feature_a] = lambda x: (x >= threshold_a).sum()

       return(aggdict)

Dan saya ingin memberikan nama bidang yang berbeda dengan ambang batas yang berbeda, untuk digabungkan dengan:

aggdict = prepareAggDict({"column_a":3500, "column_b":8200})   
dailyAgg = df.groupby([id_col,Date_col]).agg(aggdict)

Tetapi untuk beberapa alasan, agregasi hanya menerapkan item ke-2 dari kolom_b, dan tidak menerapkan yang pertama pada kolom_a. Saya mencoba memisahkannya menjadi lambda yang berbeda di dalam fungsi prepareAggDict yang berfungsi dengan baik. Sayangnya, saya harus membuat sekitar 7 ambang batas yang berbeda untuk kolom yang berbeda dan saya ingin membuatnya dengan meneruskan beberapa nama kolom dan ambang batasnya ke dalam satu metode yang akan menghasilkan kamus fungsi agregasi khusus untuk diteruskan ke groupby dengan agg( )

Sebagai contoh:

data = {
    "id_col":["A","A","B","B","B"],
    "column_a":[500,4500,8100,300,11500],
    "column_b":[800,22340,7554,300,900]
}
df = pd.DataFrame(data)

aggdict = prepareAggDict({"column_a":3500, "column_b":8200})   
dailyAgg = df.groupby(["id_col"]).agg(aggdict)

Akan menghasilkan: keluaran tak terduga! python pandas pandas-groupby python-3.7

1
Niv Cohen 10 Mei 2021, 15:15

1 menjawab

Jawaban Terbaik

Gunakan fungsi lambda untuk kecocokan dengan dict di dict.get, jika tidak ada kecocokan yang dikembalikan, nilai yang hilang:

aggdict = {"column_a":3500, "column_b":8200}
dailyAgg = df.groupby(["id_col"]).agg(lambda x: (x >= aggdict.get(x.name, np.nan)).sum())
print (dailyAgg)
        column_a  column_b
id_col                    
A              1         1
B              2         0

EDIT: Saya pikir dalam solusi Anda tidak lulus x untuk nilai grup, berikut adalah solusi yang mungkin dengan fungsi bersarang :

def prepareAggDict(p):
    def ipf(x):
        return (x >= p).sum()
    return ipf 

    
data = {
    "id_col":["A","A","B","B","B"],
    "column_a":[500,4500,8100,300,11500],
    "column_b":[800,22340,7554,300,900]
}
df = pd.DataFrame(data)

d = {"column_a":3500, "column_b":8200}
aggdict = {k: prepareAggDict(v) for k, v in d.items()}

#return same like
#aggdict = {"column_a":prepareAggDict(3500), "column_b":prepareAggDict(8200)} 

dailyAgg = df.groupby(["id_col"]).agg(aggdict)
print (dailyAgg)
        column_a  column_b
id_col                    
A              1         1
B              2         0
2
jezrael 11 Mei 2021, 10:28