Saya memiliki bingkai data panda df
seperti:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Saya ingin mengelompokkan berdasarkan kolom pertama dan mendapatkan kolom kedua sebagai daftar di baris :
A [1,2]
B [5,5,4]
C [6]
Apakah mungkin untuk melakukan sesuatu seperti ini menggunakan panda groupby?
tuple
jawaban kedua di sini: stackoverflow.com/questions/19530568/… . Lihat jawaban kedua di stackoverflow.com/questions/27439023/… untuk penjelasan.Jika kinerja penting, turun ke level numpy:
Tes:
sumber
.groupby([df.index.month, df.index.day])
bukan hanya.groupby('a')
?Cara praktis untuk mencapai ini adalah:
Lihatlah penulisan Agregasi Khusus: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py-py
sumber
lambda args: f(args)
setara denganf
agg(list)
sudah cukup. Lihat juga di sini .df.groupby('a').apply(list)
atau menggunakannya dengan agg sebagai bagian dari diktdf.groupby('a').agg({'b':list})
. Anda juga dapat menggunakannya dengan lambda (yang saya sarankan) karena Anda dapat melakukan lebih banyak dengan itu. Contoh:df.groupby('a').agg({'c':'first', 'b': lambda x: x.unique().tolist()})
yang memungkinkan Anda menerapkan fungsi seri ke col c dan unik lalu fungsi daftar ke col b.Seperti yang Anda katakan
groupby
metodepd.DataFrame
objek dapat melakukan pekerjaan.Contoh
yang memberikan dan deskripsi indeks bijaksana kelompok.
Untuk mendapatkan elemen grup tunggal, Anda dapat melakukannya, misalnya
sumber
Untuk mengatasi ini untuk beberapa kolom bingkai data:
Jawaban ini terinspirasi dari jawaban Anamika Modi . Terima kasih!
sumber
Gunakan salah satu berikut
groupby
danagg
resep.Untuk menggabungkan beberapa kolom sebagai daftar, gunakan salah satu dari yang berikut:
Untuk mengelompokkan grup hanya satu kolom, konversi grup dengan
SeriesGroupBy
objek, lalu panggilSeriesGroupBy.agg
. Menggunakan,sumber
groupby(..., sort=False)
. Di sini, tidak ada bedanya karena saya mengelompokkan pada kolom A yang sudah diurutkan.df.groupby('a')['b'].agg(lambda x: list(set(x)))
Jika mencari daftar unik saat mengelompokkan beberapa kolom ini mungkin dapat membantu:
sumber
Mari kita gunakan
df.groupby
dengan daftar danSeries
konstruktorsumber
Sudah waktunya untuk menggunakan,
agg
bukanapply
.Kapan
Jika Anda ingin beberapa kolom ditumpuk ke dalam daftar, hasilkan
pd.DataFrame
Jika Anda ingin satu kolom dalam daftar, hasilkan
ps.Series
Catatan, hasilnya
pd.DataFrame
sekitar 10x lebih lambat dari yang dihasilkanps.Series
ketika Anda hanya mengagregasi satu kolom, gunakan dalam kasus multicolumns.sumber
Di sini saya telah mengelompokkan elemen dengan "|" sebagai pemisah
sumber
Cara termudah yang saya lihat tidak mencapai sebagian besar hal yang sama setidaknya untuk satu kolom yang mirip dengan jawaban Anamika hanya dengan sintaks tuple untuk fungsi agregat.
sumber