Saya merasa ini adalah pertanyaan yang belum sempurna tetapi saya sangat baru dalam hal ini dan belum bisa memecahkannya / temukan jawabannya.
Pada akhirnya apa yang saya coba lakukan di sini adalah untuk menghitung nilai unik pada kolom tertentu dan kemudian menentukan nilai unik mana yang memiliki lebih dari satu nilai unik dalam kolom yang cocok.
Jadi untuk data ini, apa yang saya coba tentukan adalah "siapa" yang memiliki "lebih dari satu kwitansi" untuk semua pembelian, kemudian tentukan informasi yang sama berdasarkan pada setiap kategori produk.
Pendekatan saya sejauh ini:
Kami memiliki dataset seperti ini:
receipt,name,etc,category
1,george,xxx,fish
1,george,xxx,cat
2,george,xxx,fish
3,bill,xxx,fish
3,bill,xxx,dog
4,jill,xxx,cat
5,bill,xxx,cat
5,bill,xxx,cat
5,bill,xxx,dog
6,george,xxx,fish
Jadi saya bisa melakukan ini:
df.set_index(['name','receipt'])
Dan dapatkan lebih menarik
etc category
name receipt
george 1 xxx fish
1 xxx cat
2 xxx fish
bill 3 xxx fish
3 xxx dog
jill 4 xxx cat
bill 5 xxx cat
5 xxx cat
5 xxx dog
george 6 xxx fish
Pada titik ini rasanya bagiku bahwa data itu mudah dikerjakan, tetapi saya belum menemukan jawabannya.
Satu hal yang menarik bagi saya adalah bahwa jika saya mengurutkan data berdasarkan nama sebelum mengindeks, data menampilkan dikelompokkan berdasarkan nama. Dalam kedua kasus, indeksnya sama, jadi saya tidak tahu cara bermain dengan representasi data setelah pengindeksan.
Sangat mudah untuk menemukan data berdasarkan kategori menggunakan
>>> orders.loc[orders['category'] == 'fish']
etc category
name receipt
george 1 xxx fish
2 xxx fish
bill 3 xxx fish
george 6 xxx fish
Tapi yang tidak bisa saya pahami adalah bagaimana cara memberitahu panda "Temukan saya daftar nama yang memiliki lebih dari satu kwitansi".
Pertanyaan kecil:
- Apa "cara panda" untuk mendapatkan panjang nama bagian dari indeks? Saya kira saya bisa mengubah
name
kolom menjadi satu set dan mendapatkan panjangnya. Tapi saya ingin tahu tentang indeks.
Edit / Perbarui
Terima kasih atas jawaban itu! Berikut ini penjelasan tentang apa yang saya cari:
Saya mencoba mencari "pelanggan tetap": orang dengan lebih dari satu kwitansi.
Jadi set semua pelanggan saya adalah:
names: ['george','bill','jill'], ratio: 1.0
Pelanggan tetap saya:
names: ['george','bill'], ratio 0.66
Semua pelanggan 'ikan':
names: ['george','bill'], ratio: 0.666
Pelanggan 'ikan' berulang saya:
names: ['george'], ratio: 0.333
Saya pikir contoh yang diberikan terlihat membantu, tetapi jangan ragu untuk menambahkan apa pun.
Jawaban:
Saya pikir mungkin Anda mencari:
Atau, jika Anda hanya ingin total di semua kategori:
Kemudian, Anda dapat mencari mereka yang memiliki lebih dari satu:
Dan, Anda dapat menemukan panjang indeks dengan mengetik:
Dengan asumsi nama adalah kolom indeks pertama (jika tidak gantikan 1, 2, dll.)
sumber
receipts_by_name = df.groupby(['name']).unique()
dan kemudian mengambil jawabannya di kolom 'tanda terima', saya kira. Anda hanya perlu menerapkan fungsi groupby berbeda.Tidak terlalu jelas apa yang sebenarnya ingin Anda capai (akan sangat membantu untuk memahami tujuan Anda jika Anda akan memposting set data yang diinginkan / diharapkan) ...
Tetapi saya akan mencoba menebak;)
Data:
Mengatur kolom virtual
count
, menunjukkan # baris yang dikelompokkan berdasarkanname
dan memfilter (query) menggunakan.query()
metode:atau Anda dapat mengelompokkan berdasarkan beberapa kolom dan memfilter grup yang dihasilkan:
sumber