Pandas DataFrame Groupby hai cột và nhận được số lượng


166

Tôi có một khung dữ liệu gấu trúc theo định dạng sau:

df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y','x/y/z/n','x/u','x','x/u/v','x/y/z','x','x/u/v/b','-','x/y','x/y/z','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
df.columns = ['col1','col2','col3','col4','col5']

df:

   col1 col2 col3     col4 col5
0   1.1    A  1.1    x/y/z    1
1   1.1    A  1.7      x/y    3
2   1.1    A  2.5  x/y/z/n    3
3   2.6    B  2.6      x/u    2
4   2.5    B  3.3        x    4
5   3.4    B  3.8    x/u/v    2
6   2.6    B    4    x/y/z    5
7   2.6    A  4.2        x    3
8   3.4    B  4.3  x/u/v/b    6
9   3.4    C  4.5        -    3
10  2.6    B  4.6      x/y    5
11  1.1    D  4.7    x/y/z    1
12  1.1    D  4.7        x    1
13  3.3    D  4.8  x/u/v/w    1

Bây giờ tôi muốn nhóm này theo hai cột như sau:

df.groupby(['col5','col2']).reset_index()

Ra ngoài:

             index col1 col2 col3     col4 col5
col5 col2                                      
1    A    0      0  1.1    A  1.1    x/y/z    1
     D    0     11  1.1    D  4.7    x/y/z    1
          1     12  1.1    D  4.7        x    1
          2     13  3.3    D  4.8  x/u/v/w    1
2    B    0      3  2.6    B  2.6      x/u    2
          1      5  3.4    B  3.8    x/u/v    2
3    A    0      1  1.1    A  1.7      x/y    3
          1      2  1.1    A  2.5  x/y/z/n    3
          2      7  2.6    A  4.2        x    3
     C    0      9  3.4    C  4.5        -    3
4    B    0      4  2.5    B  3.3        x    4
5    B    0      6  2.6    B    4    x/y/z    5
          1     10  2.6    B  4.6      x/y    5
6    B    0      8  3.4    B  4.3  x/u/v/b    6

Tôi muốn lấy số đếm theo từng hàng như sau. Đầu ra dự kiến:

col5 col2 count
1    A      1
     D      3
2    B      2
etc...

Làm thế nào để có được đầu ra dự kiến ​​của tôi? Và tôi muốn tìm số lượng lớn nhất cho mỗi giá trị 'col2'?


Một câu hỏi rất giống vừa xuất hiện ngày hôm qua .. xem tại đây .
bdiamante

Lưu ý về hiệu suất, bao gồm các lựa chọn thay thế: Pandas groupby.size vs series.value_counts vs bộ sưu tập. Bộ đếm với nhiều loạt
jpp

Câu trả lời:


116

Tiếp theo là câu trả lời của @ Andy, bạn có thể làm như sau để giải quyết câu hỏi thứ hai của mình:

In [56]: df.groupby(['col5','col2']).size().reset_index().groupby('col2')[[0]].max()
Out[56]: 
      0
col2   
A     3
B     2
C     1
D     3

1
Tôi có thể nhận các giá trị "col5" cho điều này như C ... 1 ... 3 không?
Nilani Algiriyage 16/07/13

141

Bạn đang tìm kiếm size:

In [11]: df.groupby(['col5', 'col2']).size()
Out[11]:
col5  col2
1     A       1
      D       3
2     B       2
3     A       3
      C       1
4     B       1
5     B       2
6     B       1
dtype: int64

Để có được câu trả lời giống như Waitkuo ("câu hỏi thứ hai"), nhưng gọn gàng hơn một chút, là phân nhóm cấp độ:

In [12]: df.groupby(['col5', 'col2']).size().groupby(level=1).max()
Out[12]:
col2
A       3
B       2
C       1
D       3
dtype: int64

1
Tôi không biết tại sao tôi quên điều này: O, Có cách nào về câu hỏi thứ hai của tôi không? Tìm số lớn nhất cho mỗi giá trị "col2" và nhận giá trị "col5" tương ứng?
Nilani Algiriyage 16/07/13

23

Chèn dữ liệu vào khung dữ liệu gấu trúc và cung cấp tên cột .

import pandas as pd
df = pd.DataFrame([['A','C','A','B','C','A','B','B','A','A'], ['ONE','TWO','ONE','ONE','ONE','TWO','ONE','TWO','ONE','THREE']]).T
df.columns = [['Alphabet','Words']]
print(df)   #printing dataframe.

Đây là dữ liệu in của chúng tôi:

nhập mô tả hình ảnh ở đây

Để tạo một nhóm các khung dữ liệu trong gấu trúc và bộ đếm ,
Bạn cần cung cấp thêm một cột trong đó tính nhóm, hãy gọi cột đó là "COUNTER" trong khung dữ liệu .

Như thế này:

df['COUNTER'] =1       #initially, set that counter to 1.
group_data = df.groupby(['Alphabet','Words'])['COUNTER'].sum() #sum function
print(group_data)

ĐẦU RA:

nhập mô tả hình ảnh ở đây


9
Làm cách nào tôi có thể khiến cột Bảng chữ cái (vd.) Lặp lại bên dưới và không để lại các khoảng trống trong cột đầu tiên ??
blissweb

Làm thế nào để truy cập giá trị của mỗi nhóm được tính tổng dựa trên bảng chữ cái và từ?
Rahul G lòng

21

Giải pháp thành ngữ chỉ sử dụng một nhóm duy nhất

(df.groupby(['col5', 'col2']).size() 
   .sort_values(ascending=False) 
   .reset_index(name='count') 
   .drop_duplicates(subset='col2'))

  col5 col2  count
0    3    A      3
1    1    D      3
2    5    B      2
6    3    C      1

Giải trình

Kết quả của sizephương pháp nhóm là một Series có col5col2trong chỉ mục. Từ đây, bạn có thể sử dụng một phương thức nhóm khác để tìm giá trị tối đa của mỗi giá trị trong col2nhưng không cần thiết phải làm. Bạn có thể chỉ đơn giản là sắp xếp tất cả các giá trị descendingly và sau đó tiếp tục chỉ các hàng với sự xuất hiện đầu tiên của col2với drop_duplicatesphương pháp.


Không có thông số nào được gọi nametrong reset_index()phiên bản hiện tại của gấu trúc: pandas.pydata.org/pandas-docs/urdy/generated/ Kẻ
mmBs


Ok, xấu của tôi. Tôi đã sử dụng nó khi làm việc với DataFramekhông Series. Cảm ơn các liên kết.
mmBs

2

Nếu bạn muốn thêm một cột mới (giả sử 'Count_column') có chứa số lượng của các nhóm vào khung dữ liệu:

df.count_column=df.groupby(['col5','col2']).col5.transform('count')

(Tôi đã chọn 'col5' vì nó không chứa nan)


-2

Bạn chỉ có thể sử dụng số lượng hàm tích hợp theo chức năng nhóm

df.groupby(['col5','col2']).count()
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.