Đếm chỉ số trong gấu trúc


8

Tôi cảm thấy như đây là một câu hỏi thô sơ nhưng tôi rất mới với câu hỏi này và chỉ không thể bẻ khóa / tìm câu trả lời.

Cuối cùng, điều tôi đang cố gắng làm ở đây là đếm các giá trị duy nhất trên một cột nhất định và sau đó xác định giá trị nào trong số các giá trị duy nhất đó có nhiều hơn một giá trị duy nhất trong một cột khớp.

Vì vậy, đối với dữ liệu này, điều tôi đang cố gắng xác định là "ai" có "nhiều hơn một biên nhận" cho tất cả các giao dịch mua, sau đó xác định cùng một thông tin dựa trên từng loại sản phẩm.

Cách tiếp cận của tôi cho đến nay:

Chúng tôi có một bộ dữ liệu như thế này:

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

Vì vậy, sau đó tôi có thể làm điều này:

df.set_index(['name','receipt'])

Và nhận được nhiều thú vị hơn

                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

Tại thời điểm này, tôi cảm thấy dữ liệu rất dễ làm việc, nhưng tôi đã không tìm ra nó.

Một điều thú vị đối với tôi là nếu tôi sắp xếp dữ liệu theo tên trước khi lập chỉ mục, dữ liệu sẽ hiển thị được nhóm theo tên. Trong cả hai trường hợp, chỉ mục đều giống nhau, vì vậy tôi không biết cách chơi với biểu diễn dữ liệu sau khi lập chỉ mục.

Thật dễ dàng để tìm thấy dữ liệu theo thể loại bằng cách sử dụng

>>> orders.loc[orders['category'] == 'fish']
                etc category
name   receipt
george 1        xxx     fish
       2        xxx     fish
bill   3        xxx     fish
george 6        xxx     fish

Nhưng điều tôi không thể tìm ra là làm thế nào để nói với gấu trúc "Tìm cho tôi danh sách các tên có nhiều hơn một lần nhận".

Câu hỏi nhỏ hơn:

  • "Cách gấu trúc" để có được độ dài của phần tên của chỉ mục là gì? Tôi cho rằng tôi chỉ có thể biến namecột thành một tập hợp và có được độ dài của nó. Nhưng tôi tò mò về các chỉ số.

Chỉnh sửa / Cập nhật

Cảm ơn những câu trả lời! Dưới đây là làm rõ về những gì tôi đang tìm kiếm:

Tôi đang cố gắng tìm "khách hàng lặp lại": những người có nhiều hơn một hóa đơn.

Vì vậy, tập hợp tất cả khách hàng của tôi sẽ là:

names: ['george','bill','jill'], ratio: 1.0

Khách hàng lặp lại của tôi:

names: ['george','bill'], ratio 0.66

Tất cả khách hàng của 'cá':

names: ['george','bill'], ratio: 0.666

Khách hàng 'cá' lặp lại của tôi:

names: ['george'], ratio: 0.333

Tôi nghĩ rằng các ví dụ đưa ra có vẻ hữu ích, nhưng hãy thoải mái thêm bất cứ điều gì.


bạn có thể đăng một tập dữ liệu kết quả mong muốn (dự kiến) không?
MaxU

Câu trả lời:


5

Tôi nghĩ có lẽ bạn đang tìm kiếm:

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

Hoặc, nếu bạn chỉ muốn tổng số trên tất cả các danh mục:

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

Sau đó, bạn có thể tìm kiếm những người có nhiều hơn một:

receipts_by_name[receipts_by_name['receipt']>1]

Và, bạn có thể tìm thấy độ dài của một chỉ mục bằng cách nhập:

len(df.index.get_level_values(0))

Giả sử tên là cột chỉ mục đầu tiên (nếu không thay thế 1, 2, v.v.)


Điều này là vô cùng hữu ích. Tôi đã nói sai câu hỏi của tôi mặc dù. "Nhiều hơn một biên lai" phải là "Nhiều hơn một giao dịch, nghĩa là họ có nhiều hơn một biên lai duy nhất ".
Ông Hasquestions

Vui mừng khi nghe nó. Re: câu hỏi của bạn, hai người khác nhau như thế nào? điều gì xác định một biên nhận duy nhất - là cột 'biên nhận' là id biên nhận? và danh mục là tất cả các mặt hàng họ đã mua trên biên lai đó? Nếu vậy bạn có thể thử receipts_by_name = df.groupby(['name']).unique()và sau đó lấy câu trả lời trong cột 'biên nhận', tôi nghĩ vậy. Bạn chỉ cần áp dụng một chức năng nhóm khác nhau.
atkat12

Đúng vậy, do đó, một cách nghĩ về nó là mỗi hàng trong bộ dữ liệu đại diện cho một chi tiết đơn hàng trong giao dịch mua, vì vậy biên nhận là "ID biên nhận" của giao dịch đó. Vì vậy, ví dụ, Bill đã mua hai món đồ cho mèo trong giao dịch số 5 và anh ta chịu trách nhiệm cho giao dịch số 2. Vì vậy, anh ta là một "người mua sắm lặp lại" nhưng anh ta không phải là "người mua mèo lặp lại" vì hai lần mua mèo của anh ta xảy ra trong cùng một giao dịch.
Ông Hasquestions

3

Không rõ ràng chính xác những gì bạn đang cố gắng để đạt được (sẽ rất hữu ích để hiểu mục tiêu của bạn nếu bạn đăng các tập dữ liệu mong muốn / mong muốn) ...

Nhưng tôi sẽ cố gắng đoán;)

Dữ liệu:

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

Đặt cột ảo count, hiển thị # hàng được nhóm theo namevà lọc (truy vấn) nó bằng .query()phương thức:

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

hoặc bạn có thể nhóm theo một số cột và lọc các nhóm kết quả:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.