Menghitung indeks dalam panda

8

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 namekolom 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.

Tuan Hasquestions
sumber
dapatkah Anda memposting kumpulan data yang diinginkan (diharapkan)?
Maks

Jawaban:

5

Saya pikir mungkin Anda mencari:

receipts_by_name_x_cat = df.groupby(['name','category']).count()

Atau, jika Anda hanya ingin total di semua kategori:

receipts_by_name = df.groupby(['name']).count()

Kemudian, Anda dapat mencari mereka yang memiliki lebih dari satu:

receipts_by_name[receipts_by_name['receipt']>1]

Dan, Anda dapat menemukan panjang indeks dengan mengetik:

len(df.index.get_level_values(0))

Dengan asumsi nama adalah kolom indeks pertama (jika tidak gantikan 1, 2, dll.)

atkat12
sumber
Ini sangat membantu. Saya salah menjawab pertanyaan saya. "Lebih dari satu kwitansi" harus "Lebih dari satu transaksi, artinya mereka memiliki lebih dari satu kwitansi unik ."
Tn. Hasquestions
Senang mendengarnya. Re: pertanyaan Anda, bagaimana keduanya berbeda? apa yang mendefinisikan tanda terima unik - apakah kolom 'tanda terima' adalah tanda terima? dan kategorinya adalah semua barang yang mereka beli pada tanda terima itu? Jika demikian, Anda dapat mencoba receipts_by_name = df.groupby(['name']).unique()dan kemudian mengambil jawabannya di kolom 'tanda terima', saya kira. Anda hanya perlu menerapkan fungsi groupby berbeda.
atkat12
Benar, jadi satu cara berpikir tentang hal itu adalah setiap baris dalam dataset mewakili item baris dalam pembelian, jadi kwitansi adalah "tanda terima" dari transaksi itu. Jadi misalnya, Bill membeli dua item cat selama transaksi # 5 dan dia bertanggung jawab untuk transaksi # 2. Jadi dia adalah "pembelanja berulang" tetapi dia bukan "pembelanja kucing berulang" karena dua pembelian kucingnya terjadi selama transaksi yang sama.
Tn. Hasquestions
3

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:

In [100]: df
Out[100]:
   receipt    name  etc category
0        1  george  xxx     fish
1        1  george  xxx      cat
2        2  george  xxx     fish
3        3    bill  xxx     fish
4        3    bill  xxx      dog
5        4    jill  xxx      cat
6        5    bill  xxx      cat
7        5    bill  xxx      cat
8        5    bill  xxx      dog
9        6  george  xxx     fish

Mengatur kolom virtual count, menunjukkan # baris yang dikelompokkan berdasarkan namedan memfilter (query) menggunakan .query()metode:

In [101]: (df.assign(count=df.groupby('name').receipt.transform('size'))
     ...:    .query("category in ['dog','cat'] and count > 1"))
     ...:
Out[101]:
   receipt    name  etc category  count
1        1  george  xxx      cat      4
4        3    bill  xxx      dog      5
6        5    bill  xxx      cat      5
7        5    bill  xxx      cat      5
8        5    bill  xxx      dog      5

atau Anda dapat mengelompokkan berdasarkan beberapa kolom dan memfilter grup yang dihasilkan:

In [102]: df.groupby(['name','category']).filter(lambda x: len(x) > 2)
Out[102]:
   receipt    name  etc category
0        1  george  xxx     fish
2        2  george  xxx     fish
9        6  george  xxx     fish
MaxU
sumber