Chúng ta có thể nhóm theo 2 cột trong Python không?
Hãy xem cách kết hợp nhiều cột trong Pandas bằng cách sử dụng từ điển SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column292với sự trợ giúp của các ví dụ khác nhau Show
Ví dụ 1 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column293 ________ 194 ________ 195 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column296 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column297 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column298 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column299 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])00_______201 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column2930 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column2931______1932 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column2933 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column2932 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column2935 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column2936 Trong số này, bước tách là đơn giản nhất. Trên thực tế, trong nhiều tình huống, bạn có thể muốn chia tập dữ liệu thành các nhóm và tự mình làm điều gì đó với các nhóm đó. Trong bước áp dụng, chúng tôi có thể muốn một trong những điều sau đây
Vì tập hợp các phương thức thể hiện đối tượng trên cấu trúc dữ liệu gấu trúc nói chung là phong phú và biểu cảm, nên chúng ta thường chỉ muốn gọi một hàm DataFrame trên mỗi nhóm. Cái tên GroupBy hẳn đã khá quen thuộc với những ai đã sử dụng công cụ dựa trên SQL (hoặc In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}5), trong đó bạn có thể viết mã như SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column2 Chúng tôi mong muốn thực hiện các thao tác như thế này một cách tự nhiên và dễ dàng thể hiện bằng cách sử dụng gấu trúc. Chúng tôi sẽ giải quyết từng lĩnh vực của chức năng GroupBy, sau đó cung cấp một số ví dụ/trường hợp sử dụng không tầm thường Xem một số chiến lược nâng cao Tách một đối tượng thành các nhómcác đối tượng gấu trúc có thể được phân chia trên bất kỳ trục nào của chúng. Định nghĩa trừu tượng của nhóm là cung cấp ánh xạ nhãn tới tên nhóm. Để tạo một đối tượng GroupBy (sẽ nói thêm về đối tượng GroupBy là gì ở phần sau), bạn làm như sau # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2]) Ánh xạ có thể được chỉ định theo nhiều cách khác nhau
Nói chung, chúng tôi gọi các đối tượng nhóm là các khóa. Ví dụ: hãy xem xét DataFrame sau Ghi chú Mới trong phiên bản 0. 20 Một chuỗi được truyền tới In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}9 có thể đề cập đến một cột hoặc một cấp độ chỉ mục. Nếu một chuỗi khớp với cả tên cột và tên cấp chỉ mục thì cảnh báo sẽ được đưa ra và cột đó được ưu tiên. Điều này sẽ dẫn đến lỗi mơ hồ trong phiên bản tương lai In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.271860 Chúng ta có thể nhóm một cách tự nhiên theo cột In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 60 hoặc In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 61 hoặc cả hai SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column20 Chúng sẽ phân chia DataFrame trên chỉ mục của nó (hàng). Chúng tôi cũng có thể chia theo các cột SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column21 Bắt đầu bằng 0. 8, các đối tượng Pandas Index hiện hỗ trợ các giá trị trùng lặp. Nếu một chỉ mục không phải là duy nhất được sử dụng làm khóa nhóm trong thao tác theo nhóm, tất cả các giá trị cho cùng một giá trị chỉ mục sẽ được coi là thuộc một nhóm và do đó, đầu ra của các hàm tổng hợp sẽ chỉ chứa các giá trị chỉ mục duy nhất SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column22 Lưu ý rằng không có sự phân chia nào xảy ra cho đến khi cần thiết. Việc tạo đối tượng GroupBy chỉ xác minh rằng bạn đã vượt qua một ánh xạ hợp lệ Ghi chú Nhiều loại thao tác dữ liệu phức tạp có thể được thể hiện dưới dạng hoạt động của GroupBy (mặc dù không thể đảm bảo hiệu quả nhất). Bạn có thể khá sáng tạo với các chức năng ánh xạ nhãn Phân loại theo nhómTheo mặc định, các phím nhóm được sắp xếp trong quá trình hoạt động của In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}9. Tuy nhiên, bạn có thể vượt qua In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 63 để tăng tốc tiềm năng SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column25 Lưu ý rằng In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}9 sẽ giữ nguyên thứ tự sắp xếp các quan sát trong mỗi nhóm. Ví dụ: các nhóm được tạo bởi In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 65 dưới đây theo thứ tự chúng xuất hiện trong bản gốc In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 66 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column29 Thuộc tính đối tượng GroupByThuộc tính In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 67 là một lệnh có các khóa là các nhóm duy nhất được tính toán và các giá trị tương ứng là các nhãn trục thuộc mỗi nhóm. Trong ví dụ trên chúng ta có In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')} Việc gọi hàm Python In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 68 tiêu chuẩn trên đối tượng GroupBy chỉ trả về độ dài của lệnh In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 67, do đó, phần lớn chỉ là một tiện ích ________số 8 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])00 sẽ hoàn thành tab tên cột (và các thuộc tính khác) # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])0 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])1 GroupBy với Multi IndexVới , việc nhóm theo một trong các cấp của hệ thống phân cấp là điều hoàn toàn tự nhiên Hãy tạo một Sê-ri với # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])01 hai cấp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])2 Sau đó, chúng tôi có thể nhóm theo một trong các cấp độ trong # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])02 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])3 Nếu MultiIndex có tên được chỉ định, chúng có thể được chuyển thay vì số cấp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])4 Các hàm tổng hợp như # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])03 sẽ lấy trực tiếp tham số level. Ngoài ra, chỉ mục kết quả sẽ được đặt tên theo cấp độ đã chọn # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])5 Mới trong phiên bản 0. 6 Nhóm với nhiều cấp độ được hỗ trợ # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])6 Mới trong phiên bản 0. 20 Tên cấp chỉ mục có thể được cung cấp dưới dạng khóa # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])7 Thông tin thêm về hàm và tổng hợp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])03 sau Nhóm khung dữ liệu với các cấp chỉ mục và cộtMột DataFrame có thể được nhóm theo sự kết hợp của các cột và cấp chỉ mục bằng cách chỉ định tên cột là chuỗi và cấp chỉ mục là đối tượng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])05 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])8 Ví dụ sau nhóm # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])06 theo cấp chỉ mục # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])07 và cột In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 60 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])9 Các mức chỉ mục cũng có thể được chỉ định theo tên In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718600 Mới trong phiên bản 0. 20 Tên cấp chỉ mục có thể được chỉ định làm khóa trực tiếp cho In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}9 In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718601 Lựa chọn cột DataFrame trong GroupByVí dụ: khi bạn đã tạo đối tượng GroupBy từ DataFrame, bạn có thể muốn thực hiện điều gì đó khác cho từng cột. Do đó, sử dụng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])10 tương tự như lấy một cột từ DataFrame, bạn có thể làm In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718602 Đây chủ yếu là đường cú pháp cho sự thay thế và dài dòng hơn nhiều In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718603 Ngoài ra, phương pháp này tránh tính toán lại thông tin nhóm nội bộ bắt nguồn từ khóa đã truyền Lặp lại thông qua các nhómVới đối tượng GroupBy trong tay, việc lặp qua dữ liệu được nhóm là rất tự nhiên và hoạt động tương tự như # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])11 In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718604 Trong trường hợp nhóm theo nhiều khóa, tên nhóm sẽ là một bộ In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718605 Đó là Python-fu tiêu chuẩn nhưng hãy nhớ rằng bạn có thể giải nén bộ dữ liệu trong câu lệnh vòng lặp for nếu muốn. # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])12 Chọn một nhómCó thể chọn một nhóm duy nhất bằng cách sử dụng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])13 In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718606 Hoặc đối với một đối tượng được nhóm trên nhiều cột In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718607 tổng hợpKhi đối tượng GroupBy đã được tạo, một số phương thức có sẵn để thực hiện tính toán trên dữ liệu được nhóm. Các hoạt động này tương tự như , , và Một điều hiển nhiên là tổng hợp thông qua phương pháp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])14 hoặc tương đương với phương thức # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])15 In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718608 Như bạn có thể thấy, kết quả của phép tổng hợp sẽ có tên nhóm làm chỉ mục mới dọc theo trục được nhóm. Trong trường hợp có nhiều khóa, kết quả là một theo mặc định, mặc dù điều này có thể được thay đổi bằng cách sử dụng tùy chọn # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])16 In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : np.random.randn(8), ...: 'D' : np.random.randn(8)}) ...: In [2]: df Out[2]: A B C D 0 foo one 0.469112 -0.861849 1 bar one -0.282863 -2.104569 2 foo two -1.509059 -0.494929 3 bar three -1.135632 1.071804 4 foo two 1.212112 0.721555 5 bar two -0.173215 -0.706771 6 foo one 0.119209 -1.039575 7 foo three -1.044236 0.2718609 Lưu ý rằng bạn có thể sử dụng hàm # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])17 DataFrame để đạt được kết quả tương tự vì tên cột được lưu trữ trong kết quả # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])01 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column200 Một ví dụ tổng hợp đơn giản khác là tính toán kích thước của mỗi nhóm. Điều này được bao gồm trong GroupBy dưới dạng phương thức # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])19. Nó trả về một Sê-ri có chỉ mục là tên nhóm và có giá trị là kích thước của mỗi nhóm SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column201 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column202 Ghi chú Các hàm tổng hợp sẽ không trả về các nhóm mà bạn đang tổng hợp nếu chúng được đặt tên theo cột, khi giá trị mặc định là # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])20. Các cột được nhóm sẽ là chỉ số của đối tượng được trả về Vượt qua # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])21 sẽ trả về các nhóm mà bạn đang tổng hợp, nếu chúng được đặt tên theo cột Các hàm tổng hợp là các hàm làm giảm kích thước của các đối tượng được trả về, ví dụ. # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])22. Đây là điều xảy ra khi bạn làm ví dụ như # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])23 và nhận lại một # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])24 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])25 có thể hoạt động như bộ giảm tốc hoặc bộ lọc, xem Áp dụng nhiều chức năng cùng một lúcVới # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])24 được nhóm, bạn cũng có thể chuyển một danh sách hoặc lệnh của các hàm để thực hiện tổng hợp, xuất ra một DataFrame SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column203 Trên một In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 66 được nhóm, bạn có thể chuyển một danh sách các hàm để áp dụng cho từng cột, danh sách này tạo ra kết quả tổng hợp với chỉ mục phân cấp SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column204 Các tập hợp kết quả được đặt tên cho chính các chức năng. Nếu bạn cần đổi tên, thì bạn có thể thêm vào một chuỗi hoạt động cho một # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])24 như thế này SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column205 Đối với một In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 66 được nhóm, bạn có thể đổi tên theo cách tương tự SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column206 Áp dụng các chức năng khác nhau cho các cột DataFrameBằng cách chuyển lệnh tới # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])14, bạn có thể áp dụng một tập hợp khác cho các cột của Khung dữ liệu SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column207 Tên hàm cũng có thể là chuỗi. Để một chuỗi hợp lệ, chuỗi đó phải được triển khai trên GroupBy hoặc có sẵn qua SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column208 Ghi chú Nếu bạn chuyển lệnh tới ________ 214, thứ tự của cột đầu ra là không xác định. Nếu bạn muốn chắc chắn rằng các cột đầu ra sẽ theo một thứ tự cụ thể, bạn có thể sử dụng một # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])32. So sánh đầu ra của hai lệnh sau SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column209 Các hàm tổng hợp được tối ưu hóa cho CythonMột số tập hợp phổ biến, hiện chỉ có # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])03, # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])34, # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])35 và # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])36, đã tối ưu hóa việc triển khai Cython SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column210 Tất nhiên, # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])03 và # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])34 được triển khai trên các đối tượng gấu trúc, vì vậy đoạn mã trên sẽ hoạt động ngay cả khi không có các phiên bản đặc biệt thông qua công văn (xem bên dưới) chuyển đổiPhương thức # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])39 trả về một đối tượng được lập chỉ mục giống (cùng kích thước) với đối tượng được nhóm. Hàm biến đổi phải
Ví dụ: giả sử chúng tôi muốn chuẩn hóa dữ liệu trong mỗi nhóm SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column211 Chúng tôi hy vọng kết quả bây giờ có nghĩa là 0 và độ lệch chuẩn 1 trong mỗi nhóm, chúng tôi có thể dễ dàng kiểm tra SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column212 Chúng ta cũng có thể so sánh trực quan tập dữ liệu gốc và tập dữ liệu đã chuyển đổi SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column213 Các hàm chuyển đổi có đầu ra kích thước thấp hơn được phát sóng để phù hợp với hình dạng của mảng đầu vào SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column214 Ngoài ra, các phương thức tích hợp có thể được sử dụng để tạo ra các đầu ra giống nhau SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column215 Một biến đổi dữ liệu phổ biến khác là thay thế dữ liệu bị thiếu bằng giá trị trung bình của nhóm SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column216 Chúng tôi có thể xác minh rằng phương tiện nhóm không thay đổi trong dữ liệu được chuyển đổi và dữ liệu được chuyển đổi không chứa NA SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column217 Ghi chú Một số hàm khi áp dụng cho đối tượng groupby sẽ tự động biến đổi đầu vào, trả về đối tượng có hình dạng giống như ban đầu. Vượt qua # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])21 sẽ không ảnh hưởng đến các phương thức chuyển đổi này Ví dụ. # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])46 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column218 Cú pháp mới cho cửa sổ và hoạt động lấy mẫu lạiMới trong phiên bản 0. 18. 1 Làm việc với các hoạt động lấy mẫu lại, mở rộng hoặc cuộn ở cấp độ nhóm được sử dụng để yêu cầu ứng dụng các chức năng của trình trợ giúp. Tuy nhiên, giờ đây có thể sử dụng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])47, # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])48 và # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])49 làm phương thức trên nhóm Ví dụ dưới đây sẽ áp dụng phương pháp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])49 trên các mẫu của cột B dựa trên các nhóm của cột A SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column219 Phương thức # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])48 sẽ tích lũy một thao tác nhất định (trong ví dụ là ______252) cho tất cả các thành viên của từng nhóm cụ thể SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column220 Giả sử bạn muốn sử dụng phương pháp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])47 để nhận tần suất hàng ngày trong mỗi nhóm của khung dữ liệu của mình và muốn hoàn thành các giá trị còn thiếu bằng phương pháp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])54 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column221 lọcMới trong phiên bản 0. 12 Phương thức # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])55 trả về một tập hợp con của đối tượng ban đầu. Giả sử chúng ta chỉ muốn lấy các phần tử thuộc về các nhóm có tổng nhóm lớn hơn 2 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column222 Đối số của # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])55 phải là một hàm, được áp dụng cho toàn bộ nhóm, trả về # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])57 hoặc # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])43 Một thao tác hữu ích khác là lọc ra các phần tử thuộc nhóm chỉ có một vài thành viên SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column223 Ngoài ra, thay vì loại bỏ các nhóm vi phạm, chúng ta có thể trả về một đối tượng được lập chỉ mục tương tự trong đó các nhóm không vượt qua bộ lọc chứa đầy NaN SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column224 Đối với DataFrames có nhiều cột, các bộ lọc phải chỉ định rõ ràng một cột làm tiêu chí lọc SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column225 Ghi chú Một số hàm khi được áp dụng cho một đối tượng nhóm sẽ hoạt động như một bộ lọc trên đầu vào, trả về hình dạng thu nhỏ của bản gốc (và có khả năng loại bỏ các nhóm), nhưng với chỉ mục không thay đổi. Vượt qua # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])21 sẽ không ảnh hưởng đến các phương thức chuyển đổi này Ví dụ. # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])60 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column226 Gửi đến các phương thức ví dụKhi thực hiện tổng hợp hoặc chuyển đổi, bạn có thể chỉ muốn gọi một phương thức thể hiện trên mỗi nhóm dữ liệu. Điều này khá dễ thực hiện bằng cách chuyển các hàm lambda SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column227 Tuy nhiên, nó khá dài dòng và có thể lộn xộn nếu bạn cần chuyển các đối số bổ sung. Sử dụng một chút thông minh về siêu lập trình, GroupBy hiện có khả năng “gửi” các lệnh gọi phương thức đến các nhóm SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column228 Điều đang thực sự xảy ra ở đây là một trình bao hàm đang được tạo. Khi được gọi, nó nhận mọi đối số đã truyền và gọi hàm với bất kỳ đối số nào trên mỗi nhóm (trong ví dụ trên là hàm # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])35). Các kết quả sau đó được kết hợp với nhau nhiều theo kiểu # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])15 và # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])39 (nó thực sự sử dụng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])64 để suy ra cách dán, tài liệu tiếp theo). Điều này cho phép một số hoạt động được thực hiện khá ngắn gọn SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column229 Trong ví dụ này, chúng tôi đã cắt bộ sưu tập chuỗi thời gian thành các phần hàng năm sau đó gọi các nhóm một cách độc lập Mới trong phiên bản 0. 14. 1 Các phương thức # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])65 và # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])66 hoạt động trên các nhóm kiểu # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])24 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column250 Linh hoạt # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2]) 64Một số thao tác trên dữ liệu được nhóm có thể không phù hợp với danh mục tổng hợp hoặc biến đổi. Hoặc, bạn có thể chỉ muốn GroupBy suy ra cách kết hợp các kết quả. Đối với những điều này, hãy sử dụng hàm # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])64, có thể thay thế cho cả # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])14 và # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])39 trong nhiều trường hợp sử dụng tiêu chuẩn. Tuy nhiên, # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])64 có thể xử lý một số trường hợp sử dụng ngoại lệ, chẳng hạn SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column251 Kích thước của kết quả trả về cũng có thể thay đổi SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column252 # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])64 trên Sê-ri có thể hoạt động dựa trên giá trị được trả về từ hàm được áp dụng, bản thân đó là một sê-ri và có thể đưa kết quả lên một Khung dữ liệu SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column253 Ghi chú # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])64 có thể hoạt động như một chức năng giảm tốc, biến áp hoặc lọc, tùy thuộc vào chính xác những gì được truyền cho nó. Vì vậy, tùy thuộc vào con đường đã thực hiện và chính xác những gì bạn đang nhóm. Do đó, (các) cột được nhóm có thể được bao gồm trong đầu ra cũng như đặt các chỉ số Cảnh báo Trong triển khai hiện tại, hãy áp dụng các cuộc gọi func hai lần trên nhóm đầu tiên để quyết định xem nó có thể thực hiện đường dẫn mã nhanh hay chậm. Điều này có thể dẫn đến hành vi không mong muốn nếu func có tác dụng phụ, vì chúng sẽ có tác dụng hai lần đối với nhóm đầu tiên SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column254 Các tính năng hữu ích khácTự động loại trừ các cột "phiền toái"Một lần nữa hãy xem xét ví dụ về DataFrame mà chúng tôi đã xem xét SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column255 Giả sử chúng ta muốn tính độ lệch chuẩn được nhóm theo cột In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 60. Có một vấn đề nhỏ, cụ thể là chúng tôi không quan tâm đến dữ liệu trong cột In [21]: grouped = df.groupby(['A', 'B']) In [22]: grouped.groups Out[22]: {('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')} In [23]: len(grouped) Out[23]: 61. Chúng tôi gọi đây là cột "phiền toái". Nếu không thể áp dụng chức năng tổng hợp đã truyền cho một số cột, các cột rắc rối sẽ bị loại bỏ (âm thầm). Vì vậy, điều này không gây ra bất kỳ vấn đề SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column256 Xử lý nhóm NA và NaTNếu có bất kỳ giá trị NaN hoặc NaT nào trong khóa nhóm, chúng sẽ tự động bị loại trừ. Vì vậy sẽ không bao giờ có “nhóm NA” hay “nhóm NaT”. Đây không phải là trường hợp trong các phiên bản gấu trúc cũ hơn, nhưng người dùng thường loại bỏ nhóm NA (và hỗ trợ nó là một vấn đề đau đầu khi triển khai) Nhóm với các yếu tố được sắp xếpCác biến phân loại được biểu diễn dưới dạng thể hiện của lớp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])77 của gấu trúc có thể được sử dụng làm khóa nhóm. Nếu vậy, thứ tự của các cấp độ sẽ được giữ nguyên SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column257 Nhóm với đặc tả GrouperBạn có thể cần chỉ định thêm một chút dữ liệu để nhóm chính xác. Bạn có thể sử dụng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])05 để cung cấp điều khiển cục bộ này SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column258 Nhóm một cột cụ thể với tần suất mong muốn. Điều này giống như lấy mẫu lại SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column259 Bạn có một thông số kỹ thuật không rõ ràng ở chỗ bạn có một chỉ mục được đặt tên và một cột có thể là các nhóm tiềm năng SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column290 Lấy các hàng đầu tiên của mỗi nhómGiống như đối với DataFrame hoặc Sê-ri, bạn có thể gọi đầu và đuôi trên một nhóm SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column291 Điều này hiển thị n hàng đầu tiên hoặc cuối cùng từ mỗi nhóm Cảnh báo Trước 0. 14. 0, điều này đã được triển khai với một ứng dụng hoàn chỉnh, do đó, kết quả sẽ tôn trọng cờ as_index một cách không chính xác SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column292 Lấy hàng thứ n của mỗi nhómĐể chọn từ DataFrame hoặc Sê-ri mục thứ n, hãy sử dụng phương thức thứ n. Đây là phương pháp rút gọn và sẽ trả về một hàng (hoặc không có hàng) cho mỗi nhóm nếu bạn chuyển một int cho n SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column293 Nếu bạn muốn chọn mục không null thứ n, hãy sử dụng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])79 kwarg. Đối với DataFrame, điều này phải là # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])80 hoặc # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])81 giống như bạn sẽ chuyển sang dropna, đối với Sê-ri, điều này chỉ cần trung thực SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column294 Như với các phương pháp khác, vượt qua # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])21, sẽ đạt được quá trình lọc, trả về hàng được nhóm SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column295 Bạn cũng có thể chọn nhiều hàng từ mỗi nhóm bằng cách chỉ định nhiều giá trị thứ n dưới dạng danh sách các số nguyên SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column296 Liệt kê các mục nhómMới trong phiên bản 0. 13. 0 Để xem thứ tự xuất hiện của mỗi hàng trong nhóm của nó, hãy sử dụng phương pháp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])83 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column297 liệt kê các nhómMới trong phiên bản 0. 20. 2 Để xem thứ tự của các nhóm (trái ngược với thứ tự của các hàng trong một nhóm được cung cấp bởi # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])83), bạn có thể sử dụng phương pháp # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])85 Lưu ý rằng các số được cung cấp cho các nhóm khớp với thứ tự mà các nhóm sẽ được nhìn thấy khi lặp qua đối tượng nhóm, không phải thứ tự chúng được quan sát lần đầu tiên SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column298 âm mưuGroupby cũng hoạt động với một số phương pháp vẽ đồ thị. Ví dụ: giả sử chúng tôi nghi ngờ rằng một số tính năng trong DataFrame có thể khác nhau theo nhóm, trong trường hợp này, các giá trị trong cột 1 trong đó nhóm là “B” trung bình cao hơn 3 SELECT Column1, Column2, mean(Column3), sum(Column4) FROM SomeTable GROUP BY Column1, Column299 Chúng ta có thể dễ dàng hình dung điều này với một boxplot In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}0 Kết quả của việc gọi # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])86 là một từ điển có khóa là các giá trị của cột nhóm của chúng tôi # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])87 (“A” và “B”). Các giá trị của từ điển kết quả có thể được kiểm soát bởi từ khóa # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])88 của # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])86. Xem để biết thêm Cảnh báo Vì lý do lịch sử, # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])90 không tương đương với # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])91. Xem để được giải thích ví dụTập hợp lại theo yếu tốNhóm lại các cột của DataFrame theo tổng của chúng và tính tổng các cột được tổng hợp In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}1 Hệ số hóa nhiều cộtBằng cách sử dụng # default is axis=0 >>> grouped = obj.groupby(key) >>> grouped = obj.groupby(key, axis=1) >>> grouped = obj.groupby([key1, key2])92, chúng tôi có thể trích xuất thông tin về các nhóm theo cách tương tự (như được mô tả thêm trong API định hình lại ) nhưng . Điều này có thể hữu ích như một bước trung gian giống như phân loại trong quá trình xử lý, khi mối quan hệ giữa các hàng trong nhóm quan trọng hơn nội dung của chúng hoặc làm đầu vào cho một thuật toán chỉ chấp nhận mã hóa số nguyên. (Để biết thêm thông tin về hỗ trợ trong pandas cho dữ liệu phân loại đầy đủ, hãy xem và. ) In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}2 Groupby by Indexer để 'lấy mẫu lại' dữ liệuLấy mẫu lại tạo ra các mẫu giả thuyết mới (mẫu lại) từ dữ liệu đã quan sát hiện có hoặc từ một mô hình tạo dữ liệu. Những mẫu mới này tương tự như những mẫu đã có từ trước Để lấy mẫu lại hoạt động trên các chỉ số không phải là datetimelike , có thể sử dụng quy trình sau Trong các ví dụ sau, df. chỉ mục // 5 trả về một mảng nhị phân được sử dụng để xác định những gì được chọn cho thao tác nhóm Ghi chú Ví dụ dưới đây cho thấy cách chúng tôi có thể giảm mẫu bằng cách hợp nhất các mẫu thành ít mẫu hơn. Ở đây bằng cách sử dụng df. chỉ mục // 5, chúng tôi đang tổng hợp các mẫu trong thùng. Bằng cách áp dụng hàm std(), chúng tôi tổng hợp thông tin có trong nhiều mẫu thành một tập hợp con nhỏ các giá trị là độ lệch chuẩn của chúng, do đó làm giảm số lượng mẫu In [19]: df.groupby('A').groups Out[19]: {'bar': Int64Index([1, 3, 5], dtype='int64'), 'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')} In [20]: df.groupby(get_letter_type, axis=1).groups Out[20]: {'consonant': Index(['B', 'C', 'D'], dtype='object'), 'vowel': Index(['A'], dtype='object')}3 Trả lại một Sê-ri để truyền bá tênNhóm các cột DataFrame, tính toán một tập hợp các chỉ số và trả về một Chuỗi có tên. Tên sê-ri được sử dụng làm tên cho chỉ mục cột. Điều này đặc biệt hữu ích khi kết hợp với các hoạt động định hình lại chẳng hạn như xếp chồng trong đó tên chỉ mục cột sẽ được sử dụng làm tên của cột được chèn Tôi có thể nhóm theo 2 cột trong Python không?Nhóm theo nhiều cột
. You can do this by passing a list of column names to groupby instead of a single string value.
Bạn có thể nhóm hai cột không?groupby() có thể lấy danh sách các cột để nhóm theo nhiều cột và sử dụng các hàm tổng hợp để áp dụng một hoặc nhiều tập hợp cùng một lúc.
Chúng tôi có thể sử dụng nhóm theo nhiều cột trong Pandas không?Pandas cũng cho phép bạn sử dụng các tập hợp khác nhau trên mỗi cột khi sử dụng nhóm có nhiều cột .
Làm cách nào để nhóm Pandas DataFrame theo nhiều cột trong python?Sử dụng GroupBy trên Pandas DataFrame nhìn chung khá đơn giản. trước tiên chúng ta cần nhóm dữ liệu theo một hoặc nhiều cột; |