Saya memiliki data saya dalam bingkai data panda sebagai berikut:
df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})
Jadi, data saya terlihat seperti ini
----------------------------
index A B
0 yes yes
1 yes no
2 yes no
3 yes no
4 no yes
5 no yes
6 yes no
7 yes yes
8 yes yes
9 no no
-----------------------------
Saya ingin mengubahnya menjadi bingkai data lain. Output yang diharapkan dapat ditampilkan dalam skrip python berikut:
output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})
Jadi, keluaran yang saya harapkan terlihat seperti ini
--------------------------------------------
index A B count
--------------------------------------------
0 no no 1
1 no yes 2
2 yes no 4
3 yes yes 3
--------------------------------------------
Sebenarnya, saya dapat mencapai untuk menemukan semua kombinasi dan menghitungnya dengan menggunakan perintah berikut: mytable = df1.groupby(['A','B']).size()
Namun, ternyata kombinasi tersebut ada dalam satu kolom. Saya ingin memisahkan setiap nilai dalam kombinasi ke kolom yang berbeda dan juga menambahkan satu kolom lagi untuk hasil penghitungan. Apakah mungkin melakukan itu? Bolehkah saya mendapatkan saran anda Terima kasih sebelumnya.
set_index()
. Terus mencoba menggunakangroupby()
untuk mengelompokkan bersama baris dengan pasangan kolom umum tertentu. Luar biasa, terima kasih!Menempatkan jawaban yang sangat bagus dari @ EdChum ke dalam sebuah fungsi
count_unique_index
. Metode unik hanya berfungsi pada seri pandas, bukan pada bingkai data. Fungsi di bawah ini mereproduksi perilaku fungsi unik di R:Dan menambahkan hitungan kejadian seperti yang diminta oleh OP.
df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'], 'B':['yes','no','no','no','yes','yes','no','yes','yes','no']}) def count_unique_index(df, by): return df.groupby(by).size().reset_index().rename(columns={0:'count'}) count_unique_index(df1, ['A','B']) A B count 0 no no 1 1 no yes 2 2 yes no 4 3 yes yes 3
sumber
Saya belum melakukan uji waktu dengan ini tetapi menyenangkan untuk dicoba. Pada dasarnya mengubah dua kolom menjadi satu kolom tupel. Sekarang ubah itu menjadi dataframe, lakukan 'value_counts ()' yang menemukan elemen unik dan menghitungnya. Bermain-main dengan zip lagi dan letakkan kolom sesuai urutan yang Anda inginkan. Anda mungkin dapat membuat langkah-langkahnya lebih elegan tetapi bekerja dengan tupel tampaknya lebih alami bagi saya untuk masalah ini
b = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],'B':['yes','no','no','no','yes','yes','no','yes','yes','no']}) b['count'] = pd.Series(zip(*[b.A,b.B])) df = pd.DataFrame(b['count'].value_counts().reset_index()) df['A'], df['B'] = zip(*df['index']) df = df.drop(columns='index')[['A','B','count']]
sumber