Apakah ada cara bawaan panda untuk menerapkan dua fungsi penggabungan yang berbeda f1, f2
ke kolom yang sama df["returns"]
, tanpa harus memanggil agg()
beberapa kali?
Contoh kerangka data:
import pandas as pd
import datetime as dt
pd.np.random.seed(0)
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
Salah secara sintaksis, tetapi secara intuitif benar, cara untuk melakukannya adalah:
# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})
Jelas, Python tidak mengizinkan kunci duplikat. Apakah ada cara lain untuk mengungkapkan masukan agg()
? Mungkin daftar tupel [(column, function)]
akan bekerja lebih baik, untuk memungkinkan beberapa fungsi diterapkan ke kolom yang sama? Tapi agg()
sepertinya itu hanya menerima kamus.
Apakah ada solusi untuk ini selain mendefinisikan fungsi bantu yang hanya menerapkan kedua fungsi di dalamnya? (Bagaimana cara kerjanya dengan agregasi?)
Jawaban:
Anda cukup meneruskan fungsi sebagai daftar:
atau sebagai kamus:
sumber
TLDR; Pandas
groupby.agg
memiliki sintaks baru yang lebih mudah untuk menentukan (1) agregasi di beberapa kolom, dan (2) beberapa agregasi di kolom. Jadi, untuk melakukan ini pada panda> = 0,25 , gunakanATAU
Panda> = 0.25: Agregasi Bernama
Panda telah mengubah perilaku yang
GroupBy.agg
mendukung sintaks yang lebih intuitif untuk menentukan agregasi bernama. Lihat bagian dokumen 0.25 tentang Penyempurnaan serta masalah GitHub yang relevan GH18366 dan GH26512 .Dari dokumentasi,
Anda sekarang dapat mengirimkan tupel melalui argumen kata kunci. Tupel mengikuti format
(<colName>, <aggFunc>)
.Sebagai alternatif, Anda dapat menggunakan
pd.NamedAgg
(pada dasarnya bernamauple) yang membuat segalanya lebih eksplisit.Bahkan lebih sederhana untuk Seri, cukup teruskan aggfunc ke argumen kata kunci.
Terakhir, jika nama kolom Anda bukan pengenal python yang valid, gunakan kamus dengan membongkar:
Panda <0,25
Dalam versi panda yang lebih baru yang mengarah ke 0,24, jika menggunakan kamus untuk menentukan nama kolom untuk keluaran agregasi, Anda akan mendapatkan
FutureWarning
:Menggunakan kamus untuk mengganti nama kolom sudah tidak digunakan lagi di v0.20. Pada versi panda yang lebih baru, ini dapat ditentukan secara lebih sederhana dengan meneruskan daftar tupel. Jika menentukan fungsi dengan cara ini, semua fungsi untuk kolom itu perlu ditetapkan sebagai tupel dari pasangan (nama, fungsi).
Atau,
sumber
df.groupby('kind')['height']
?df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
Apakah sesuatu seperti ini berhasil:
sumber
aggregate
itu secara eksplisit mengatakan bahwa ketika adict
dilewatkan, kuncinya haruslah nama kolom. Jadi, contoh Anda adalah sesuatu yang Anda ketik tanpa memeriksa kesalahan ini, atau Pandas merusak dokumennya sendiri di sini.returns
di sana. Jadi ini adalah agregat versi Seri? Saya ingin melakukan versi agregat DataFrame, dan saya ingin menerapkan beberapa agregasi yang berbeda ke setiap kolom sekaligus.