hasil groupby panda menggunakan kombinasi array boolean yang berbeda sebagai kunci

Aug 19 2020

Saya mencoba memahami grup dengan menggunakan array boolean sebagai kunci, berikut adalah kode uji,

a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
print(a)

     A      B      C
0   True  False  False
1  False   True  False

Kemudian saya mencoba kombinasi yang berbeda dari array boolean, yang tampaknya hasil groupby semua r sama

b=a.groupby([False,False])
b.apply(pd.DataFrame)

       A     B       C
0   True    False   False
1   False   True    False

c=a.groupby([True,False])
c.apply(pd.DataFrame)

      A      B       C
0   True    False   False
1   False   True    False

d=a.groupby([False,True])
d.apply(pd.DataFrame)

     A       B       C
0   True    False   False
1   False   True    False

e=a.groupby([False,True])
e.apply(pd.DataFrame)

     A       B       C
0   True    False   False
1   False   True    False

Jawaban

RichieV Aug 20 2020 at 04:23

Mari kita hancurkan

.groubpy().apply(pd.DataFrame)seperti yang Anda gunakan di semua varian, mengambil baris dari setiap grup dan membuat kerangka data, yang pada dasarnya kembali self, sehingga keluarannya terlihat sama, tetapi cara panda mencapainya berbeda dalam setiap kasus

  1. b=a.groupby([False,False]): kedua baris milik grup yang sama (group_id False), dan diurai bersama sekali untuk membentuk df yang sama

  2. c=a.groupby([True,False]): ada dua kelompok dengan masing-masing satu baris. Apply mengambil setiap grup dan membangun dua DataFrames terpisah (satu per grup). Kemudian menggabungkan dan mengembalikan df yang identik dengan aslinya

  3. d=a.groupby([False,True]): sama dengan # 2 tetapi sekarang baris pertama menjadi milik grup False. Jika Anda menggabungkan atau menerapkan fungsi yang berbeda (selain pandas.DataFrame) Anda akan melihat df dengan True, Falsesebagai indeks (secara default mengurutkan grup) dan baris 1 akan muncul sebagai baris pertama, karena itu milik grupTrue

1 AkshaySehgal Aug 20 2020 at 04:14

Ini karena parameter pengelompokan yang Anda teruskan tidak dapat memotong kerangka data menjadi bagian-bagian yang diperlukan. Jadi itu hanya menyalin seluruh dataframe dan 'zip' ke array pengelompokan yang Anda lewati. Sebuah contoh -

a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])

c = a.groupby([True,False])

print('length of grouper object:',len(c))
print(' ')
print(list(c)[0])
print(' ')
print(list(c)[1])
length of grouper object: 2
 
(False,        A     B      C
1  False  True  False)
 
(True,       A      B      C
0  True  False  False)

Perhatikan bahwa dengan pengelompokan array [False, True], itu hanya membuat zip seluruh dataframe a dengan masing-masing. Jika Anda malah meneruskan sesuatu yang bisa ditemukan di sumbu 1, itu akan mempertimbangkan item dalam seri itu untuk mengelompokkan dataset.

Cara lain untuk melihatnya adalah bahwa parameter pengelompokan harus berupa rangkaian dengan nama dan nama ini harus ditemukan di kolom bingkai data. Jika Anda melewatkan sebuah array [True, False], itu pada dasarnya diinterpretasikan sebagai seri tanpa nama dan oleh karena itu tidak bisa mendapatkan kuncinya untuk melakukan pemisahan.

Gambar yang bagus untuk diikuti adalah sebagai berikut jika Anda ingin memahami cara kerja groupby -

Pemisahan terjadi pada kunci yang disediakan, dan kunci harus dapat direferensikan dalam indeks / kolom, jika tidak, tidak dapat memisahkan dan hanya mengembalikan kerangka data yang tidak terpisahkan dengan setiap grup. Langkah pertama ini yang dilakukan oleh kerapu, selanjutnya adalah menerapkan dan menggabungkan langkah-langkah yang sangat mudah. Dalam tupel yang Anda lihat di atas (keluaran tercetak), fungsi terapkan beroperasi pada t[1]elemen setiap tupel, setelah itu menggabungkannya dengan t[0]elemen dari setiap tupel dan menggabungkannya secara vertikal.