Trục trong gấu trúc có nghĩa là gì?


269

Đây là mã của tôi để tạo một khung dữ liệu:

import pandas as pd
import numpy as np

dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB'))

sau đó tôi nhận được dataframe:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|
+------------+---------+--------+

Khi tôi gõ commANGE:

dff.mean(axis=1)

Tôi đã nhận :

0    1.074821
dtype: float64

Theo tham chiếu của gấu trúc, trục = 1 là viết tắt của các cột và tôi hy vọng kết quả của lệnh sẽ là

A    0.626386
B    1.523255
dtype: float64

Vì vậy, đây là câu hỏi của tôi: trục trong gấu trúc có nghĩa là gì?

Câu trả lời:


382

Nó chỉ định trục dọc theo đó các phương tiện được tính toán. Theo mặc định axis=0. Điều này phù hợp với numpy.meancách sử dụng khi axisđược chỉ định rõ ràng (in numpy.mean, trục == Không theo mặc định, tính giá trị trung bình trên mảng được làm phẳng), trong đó axis=0dọc theo các hàng (cụ thể là chỉ mục trong gấu trúc) và axis=1dọc theo các cột . Để thêm rõ ràng, người ta có thể chọn chỉ định axis='index'(thay vì axis=0) hoặc axis='columns'(thay vì axis=1).

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
             |         |
             | axis=0  |
                      

164
Thông thường trục = 0 được gọi là "cột khôn ngoan" (và trục = 1 "hàng khôn ngoan"), tôi nghĩ "dọc theo các hàng" là khó hiểu. (Mặc dù "pic" đẹp :))
Andy Hayden

11
@AndyHayden yeah, nhưng có lẽ cả hai đều hơi khó hiểu, với những người lần đầu tiên bắt gặp điều này;)
zhangxaochen

43
Ngoài ra, lý do axis=0chỉ ra tổng hợp dọc theo các hàng và axis=1chỉ ra tổng hợp dọc theo các cột là do cách bạn lập chỉ mục vào một khung dữ liệu. Trong df.iloc[row, column], rowở vị trí chỉ số 0 và columnở vị trí chỉ mục 1. Numpy khái quát hóa điều này thành N kích thước, đó là nơi suy nghĩ theo trục mà tập hợp sụp đổ bắt đầu có ý nghĩa hơn "khôn ngoan theo hàng" hoặc "khôn ngoan theo cột" ".
Tom Q.

11
Tôi vẫn cảm thấy khó hiểu. Nếu tôi làm df.drop("A", axis = 1)thì cột A sẽ bị loại bỏ. Nó không phải là "dọc theo hàng" cũng không phải "hàng khôn ngoan" mà là thả cột A.
ytu

5
@ytu axis=0có nghĩa là mỗi hàng là một số lượng lớn, chúng tôi chỉ có thể thao tác liên hàng DataFrame thay vì hàng bên trong. axis=1có nghĩa là mỗi cột là một khối, chúng ta chỉ có thể thao tác giữa cột DataFrame thay vì cột bên trong. Vì vậy, nếu bạn sử dụng df.drop("A", axis = 1), nó sẽ thả cả một cột.
Belter

106

Những câu trả lời này giúp giải thích điều này, nhưng nó vẫn không hoàn toàn trực quan cho một người không lập trình (tức là một người như tôi lần đầu tiên học Python trong bối cảnh của khóa học khoa học dữ liệu). Tôi vẫn thấy việc sử dụng các thuật ngữ "dọc" hoặc "cho mỗi" wrt vào các hàng và cột là khó hiểu.

Điều có ý nghĩa hơn với tôi là nói theo cách này:

  • Trục 0 sẽ hoạt động trên tất cả các ROWS trong mỗi CỘT
  • Trục 1 sẽ hoạt động trên tất cả các MÀU SẮC trong mỗi ROW

Vì vậy, giá trị trung bình trên trục 0 sẽ là giá trị trung bình của tất cả các hàng trong mỗi cột và giá trị trung bình trên trục 1 sẽ là giá trị trung bình của tất cả các cột trong mỗi hàng.

Cuối cùng, điều này cũng nói giống như @zhangxaochen và @Michael, nhưng theo cách dễ dàng hơn để tôi tiếp thu.


Tôi nghĩ rằng sự nhầm lẫn xuất phát từ sự phức tạp của mỗi cái gọi là "hành động". df.dropna (trục = 0) trước tiên sẽ kiểm tra tất cả các MÀU SẮC trong mỗi ROW và sau đó thả các ROWS đó bằng null. Trục nói về bước cuối cùng nhưng bộ não của chúng ta sẽ tập trung vào phần đầu tiên.
Shawn Chen

69

Hãy hình dung (bạn sẽ luôn nhớ), nhập mô tả hình ảnh ở đây

Trong gấu trúc:

  1. trục = 0 có nghĩa là dọc theo "chỉ mục". Đó là một hoạt động khôn ngoan .

Giả sử, để thực hiện thao tác concat () trên dataframe1 & dataframe2, chúng tôi sẽ lấy dataframe1 và lấy hàng thứ 1 từ dataframe1 và đặt vào DF mới, sau đó chúng tôi lấy ra một hàng khác từ dataframe1 và đưa vào DF mới, chúng tôi lặp lại quy trình này cho đến khi chúng ta đạt đến đáy của dataframe1. Sau đó, chúng tôi thực hiện quy trình tương tự cho dataframe2.

Về cơ bản, xếp chồng dataframe2 lên trên dataframe1 hoặc ngược lại.

Ví dụ: làm một đống sách trên bàn hoặc sàn nhà

  1. trục = 1 có nghĩa là dọc theo "cột". Đó là một hoạt động khôn ngoan cột.

Giả sử, để thực hiện concat () hoạt động trên dataframe1 & dataframe2, chúng tôi sẽ đưa ra 1 cột hoàn chỉnh (aka 1 series) của dataframe1 và địa điểm vào DF mới, sau đó chúng tôi đưa ra cột thứ hai của dataframe1 và giữ liền kề với nó (ngang ) , chúng tôi phải lặp lại thao tác này cho đến khi tất cả các cột kết thúc. Sau đó, chúng tôi lặp lại quá trình tương tự trên dataframe2. Về cơ bản, xếp chồng dataframe2 sang một bên.

Ví dụ: sắp xếp sách trên giá sách.

Hơn thế nữa, vì các mảng là biểu diễn tốt hơn để biểu diễn cấu trúc n chiều lồng nhau so với ma trận! vì vậy, bên dưới có thể giúp bạn nhiều hơn để hình dung cách trục đóng vai trò quan trọng khi bạn khái quát hóa nhiều hơn một chiều. Ngoài ra, bạn thực sự có thể in / ghi / vẽ / trực quan hóa bất kỳ mảng n-dim nào, nhưng, viết hoặc hiển thị giống nhau trong biểu diễn ma trận (3 mờ) là không thể trên một tờ giấy nhiều hơn 3 chiều.

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


6
Tôi nghĩ rằng câu trả lời này là đúng. Bạn cần hình dung nó. trục = 0 (hoặc trục = 'hàng' là trục ngang. trục = 1 (hoặc trục = 'cột') là trục dọc. Để đưa nó đi xa hơn, nếu bạn sử dụng phương thức thả gấu trúc, để xóa cột hoặc hàng, nếu bạn chỉ định angle = 1 bạn sẽ xóa các cột. Nếu bạn chỉ định trục = 0, bạn sẽ xóa các hàng khỏi tập dữ liệu. Vì vậy, nếu chúng tôi có một số dataframe trong biến df: df.drop (0, angle = 0) sẽ xóa toàn bộ hàng đầu tiên của tập dữ liệu df.drop ('lớp', trục = 1) sẽ xóa cột 'lớp' khỏi tập dữ liệu Hy vọng điều này làm rõ thêm một chút ...
Roboblob

3
@Roboblob - vẫn khó hiểu. df.drop (n, trục = 1) hoạt động trên một cột. Tại sao df.mean (trục = 1) không hành động trên một cột?
matty

@mô, đầu tiên! có bàn tay của bạn bẩn!, nó rất thẳng về phía trước. Để bạn tham khảo, drop & mean , trục = 1 là giống nhau cho cả hai, vui lòng đặt câu hỏi mới nếu bạn chưa hiểu điều gì trong ví dụ của mình!
Anu

2
@anu - Tay bẩn? Chúng ta không cần phải lộn xộn SO với các câu hỏi trùng lặp. Tôi tin tưởng rằng một hoặc nhiều câu trả lời trên trang này có thể được làm rõ để giảm sự nhầm lẫn này. Tôi sẽ tự làm điều đó nếu tôi có thể, nhưng hiện tại, tôi chỉ biết sử dụng chúng. Tôi hiểu trục nào sẽ sử dụng để lấy dữ liệu tôi muốn. Tuy nhiên, sự nhầm lẫn vẫn là lý do tại sao có nghĩa là () và drop () cảm thấy như chúng ảnh hưởng đến các trục đối lập.
matty

2
Tôi sợ câu trả lời này là vô cùng khó hiểu. Bạn nói về hành động trên các hàng là trục = 0 nhưng bạn vẽ các mũi tên màu đỏ đi xuống các cột. Bạn nói về trục = 1 hành động trên các cột, nhưng bạn vẽ mũi tên đi ngang qua một hàng. Bất cứ ai nghĩ ra hệ thống này đều không nghĩ rằng nó rất tốt.
đáNwaves

33

axisđề cập đến kích thước của mảng, trong trường hợp pd.DataFrames axis=0là kích thước chỉ xuống dưới và kích thước axis=1chỉ về bên phải.

Ví dụ: Hãy nghĩ về một ndarrayvới hình dạng (3,5,7).

a = np.ones((3,5,7))

alà 3 chiều ndarray, tức là nó có 3 trục ("trục" là số nhiều của "trục"). Cấu hình của asẽ trông giống như 3 lát bánh mì trong đó mỗi lát có kích thước 5 x 7. a[0,:,:]sẽ đề cập đến lát thứ 0, a[1,:,:]sẽ đề cập đến lát thứ 1, v.v.

a.sum(axis=0)sẽ áp dụng sum()dọc theo trục 0-th của a. Bạn sẽ thêm tất cả các lát và kết thúc với một lát hình (5,7).

a.sum(axis=0) tương đương với

b = np.zeros((5,7))
for i in range(5):
    for j in range(7):
        b[i,j] += a[:,i,j].sum()

ba.sum(axis=0)cả hai sẽ trông như thế này

array([[ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.]])

Trong a pd.DataFrame, các trục hoạt động theo cách tương tự như trong numpy.arrays: axis=0sẽ áp dụng sum()hoặc bất kỳ hàm giảm nào khác cho mỗi cột.

NB Trong câu trả lời của @ zhangxaochen, tôi thấy các cụm từ "dọc theo hàng" và "dọc theo các cột" hơi khó hiểu. axis=0nên tham khảo "dọc theo mỗi cột" và axis=1"dọc theo mỗi hàng".


1
Đây là một câu trả lời tốt hơn câu trả lời được chấp nhận - vì Safak đề cập đến các cụm từ được sử dụng có từ ngữ kém và dẫn đến sự nhầm lẫn nhiều hơn.
javadba

Đây là câu trả lời tốt hơn
Ravi G

24

Cách dễ nhất để tôi hiểu là nói về việc bạn đang tính toán một thống kê cho mỗi cột ( axis = 0) hoặc mỗi hàng ( axis = 1). Nếu bạn tính một thống kê, hãy nói một giá trị trung bình, với axis = 0bạn sẽ có được thống kê đó cho mỗi cột. Vì vậy, nếu mỗi quan sát là một hàng và mỗi biến nằm trong một cột, bạn sẽ nhận được giá trị trung bình của từng biến. Nếu bạn đặt axis = 1thì bạn sẽ tính toán thống kê cho mỗi hàng. Trong ví dụ của chúng tôi, bạn sẽ nhận được giá trị trung bình cho mỗi quan sát trên tất cả các biến của bạn (có lẽ bạn muốn trung bình của các biện pháp liên quan).

axis = 0: by cột = cột-khôn ngoan = dọc theo các hàng

axis = 1: by row = row-Wis = dọc theo các cột


Tôi nghĩ "cùng" nên được thay thế bằng "ngang". Đi dọc theo một cái gì đó (ví dụ đường) với tôi có nghĩa là ở lại trên đó, nhưng với axis=0chúng tôi không ở lại hàng nói khi, nói, tính toán trung bình; thay vì chúng tôi đi qua tất cả các hàng trong một cột.
Bối rối

13

Hãy nhìn vào bảng từ Wiki. Đây là ước tính của IMF về GDP từ năm 2010 đến 2019 cho mười quốc gia hàng đầu. nhập mô tả hình ảnh ở đây

1. Trục 1 sẽ hành động cho mỗi hàng trên tất cả các cột
Nếu bạn muốn tính GDP trung bình (trung bình) cho MACHI quốc gia trong thập kỷ (2010-2019), bạn cần phải làm df.mean(axis=1). Ví dụ: nếu bạn muốn tính GDP trung bình của Hoa Kỳ từ năm 2010 đến 2019,df.loc['United States','2010':'2019'].mean(axis=1)

2. Trục 0 sẽ hành động cho mỗi cột trên tất cả các hàng
Nếu tôi muốn tính GDP trung bình (trung bình) cho MACHI năm cho tất cả các quốc gia, bạn cần phải làm df.mean(axis=0). Ví dụ: nếu bạn muốn tính GDP trung bình của năm 2015 cho Hoa Kỳ, Trung Quốc, Nhật Bản, Đức và Ấn Độ,df.loc['United States':'India','2015'].mean(axis=0)

Lưu ý: Mã trên sẽ chỉ hoạt động sau khi đặt cột "Quốc gia (hoặc lãnh thổ phụ thuộc)" làm Chỉ mục, sử dụng set_indexphương pháp.


11

Trục trong quan điểm của lập trình là vị trí trong hình dạng tuple. Đây là một ví dụ:

import numpy as np

a=np.arange(120).reshape(2,3,4,5)

a.shape
Out[3]: (2, 3, 4, 5)

np.sum(a,axis=0).shape
Out[4]: (3, 4, 5)

np.sum(a,axis=1).shape
Out[5]: (2, 4, 5)

np.sum(a,axis=2).shape
Out[6]: (2, 3, 5)

np.sum(a,axis=3).shape
Out[7]: (2, 3, 4)

Có nghĩa là trên trục sẽ khiến kích thước đó bị loại bỏ.

Đề cập đến câu hỏi ban đầu, hình dạng dff là (1,2). Sử dụng trục = 1 sẽ thay đổi hình dạng thành (1,).


8

Nhà thiết kế gấu trúc, Wes McKinney, từng làm việc chuyên sâu về dữ liệu tài chính. Hãy nghĩ về các cột như tên chứng khoán và chỉ số như giá hàng ngày. Sau đó, bạn có thể đoán hành vi mặc định là gì (nghĩa là axis=0) đối với dữ liệu tài chính này. axis=1có thể được nghĩ đơn giản là "hướng khác".

Ví dụ, các chức năng thống kê, chẳng hạn như mean(), sum(), describe(), count()tất cả mặc định để cột khôn ngoan vì nó có ý nghĩa hơn để làm họ cho mỗi cổ phiếu. sort_index(by=)cũng mặc định cho cột. fillna(method='ffill')sẽ điền vào cột vì nó là cùng một chứng khoán.dropna()mặc định để hàng vì có lẽ bạn chỉ muốn loại bỏ giá vào ngày đó thay vì vứt bỏ tất cả giá của cổ phiếu đó.

Tương tự, lập chỉ mục ngoặc vuông đề cập đến các cột vì việc chọn cổ phiếu thay vì chọn một ngày là phổ biến hơn.


1
lý luận của bạn nghe có vẻ đúng nhưng có nghĩa là (), sum () và các hàm khác mặc định là (trục = 0) theo hàng và không như đã đề cập ở trên. Và hàng khôn ngoan dường như hành xử như chúng ta mong đợi cột khôn ngoan :) và đó dường như là sự nhầm lẫn.
bincob

5

một trong những cách dễ dàng để nhớ trục 1 (cột), so với trục 0 (hàng) là đầu ra mà bạn mong đợi.

  • nếu bạn mong đợi một đầu ra cho mỗi hàng bạn sử dụng trục = 'cột',
  • mặt khác, nếu bạn muốn một đầu ra cho mỗi cột, bạn sử dụng trục = 'hàng'.

Cảm ơn. Điều này, tuy nhiên, chỉ hoạt động cho tính toán phải không? Nó không hoạt động đối với các phương thức như , pd.concathoặc df.dropna()sử dụng trục kewarg trong khả năng nhận dạng nhiều hơn.
Bowen Liu

3

Vấn đề với việc sử dụng axis=đúng cách là sử dụng cho 2 trường hợp chính khác nhau:

  1. Để tính toán giá trị tích lũy hoặc sắp xếp lại dữ liệu (ví dụ: sắp xếp).
  2. Để thao tác ("chơi" với) các thực thể (ví dụ: dataframes ).

Ý tưởng chính đằng sau câu trả lời này là để tránh nhầm lẫn, chúng tôi chọn một số hoặc một tên để chỉ định trục cụ thể, tùy theo hướng nào rõ ràng hơn, trực quan và mô tả.

Pandas dựa trên NumPy, dựa trên toán học, đặc biệt là ma trận n chiều. Dưới đây là hình ảnh để sử dụng phổ biến tên của các trục trong toán học trong không gian 3 chiều:

nhập mô tả hình ảnh ở đây Hình ảnh này chỉ để ghi nhớ các số thứ tự của trục :

  • 0 cho trục x,
  • 1 cho trục y và
  • 2 cho trục z.

Các trục z chỉ dành cho tấm ; đối với các tệp dữ liệu, chúng tôi sẽ giới hạn sự quan tâm của chúng tôi đối với mặt phẳng cơ bản 2 chiều có màu xanh lục với trục x ( 0, dọc)trục y ( 1, ngang).

nhập mô tả hình ảnh ở đây Đó là tất cả cho các số là giá trị tiềm năng của axis=tham số.

Các tên của các trục là 'index'(bạn có thể sử dụng bí danh 'rows') và 'columns', và cho lời giải thích này nó là không quan trọng mối quan hệ giữa các tên và số thứ tự (các trục), như mọi người đều biết những gì từ "hàng""cột" bình ( và mọi người ở đây - tôi cho rằng - biết từ "index" trong gấu trúc nghĩa là gì).

Và bây giờ, lời giới thiệu của tôi:

  1. Nếu bạn muốn tính toán một giá trị tích lũy , bạn có thể tính toán nó từ các giá trị nằm dọc theo trục 0 (hoặc dọc theo trục 1 ) - sử dụng axis=0(hoặc axis=1).

    Tương tự, nếu bạn muốn sắp xếp lại các giá trị , hãy sử dụng số trục của trục, dọc theo đó là dữ liệu được định vị để sắp xếp lại (ví dụ: để sắp xếp ).

  2. Nếu bạn muốn thao tác (ví dụ concatenate ) các thực thể (ví dụ: dataframes ) - hãy sử dụng axis='index'(từ đồng nghĩa axis='rows':) hoặc axis='columns'để chỉ định thay đổi kết quả - chỉ mục ( hàng ) hoặc cột tương ứng.
    (Để nối , bạn sẽ có được một chỉ mục dài hơn (= nhiều hàng hơn) hoặc nhiều cột tương ứng.)


Đây là câu trả lời hay nhất và có lẽ nên được đánh dấu là câu trả lời đúng của op!
Anze

2

Điều này dựa trên câu trả lời của @ Safak. Cách tốt nhất để hiểu các trục trong gấu trúc / numpy là tạo một mảng 3d và kiểm tra kết quả của hàm sum dọc theo 3 trục khác nhau.

 a = np.ones((3,5,7))

sẽ là:

    array([[[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]]])

Bây giờ hãy kiểm tra tổng các phần tử của mảng dọc theo mỗi trục:

 x0 = np.sum(a,axis=0)
 x1 = np.sum(a,axis=1)
 x2 = np.sum(a,axis=2)

sẽ cho bạn kết quả như sau:

   x0 :
   array([[3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.]])

   x1 : 
   array([[5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.]])

  x2 :
   array([[7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.]])

2

Tôi hiểu theo cách này:

Giả sử nếu hoạt động của bạn yêu cầu di chuyển từ trái sang phải / phải sang trái trong một khung dữ liệu, thì rõ ràng bạn đang hợp nhất các cột tức là. bạn đang hoạt động trên các cột khác nhau. Đây là trục = 1

Thí dụ

df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A', 'B', 'C', 'D'])
print(df)
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11 

df.mean(axis=1)

0    1.5
1    5.5
2    9.5
dtype: float64

df.drop(['A','B'],axis=1,inplace=True)

    C   D
0   2   3
1   6   7
2  10  11

Điểm cần lưu ý ở đây là chúng tôi đang hoạt động trên các cột

Tương tự, nếu hoạt động của bạn yêu cầu di chuyển từ trên xuống dưới / dưới lên trên trong một khung dữ liệu, bạn đang hợp nhất các hàng. Đây là trục = 0 .


1

trục = 0 có nghĩa là lên xuống trục = 1 có nghĩa là trái sang phải

sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0)

Ví dụ đã cho là lấy tổng của tất cả dữ liệu trong cột ==.


0

Suy nghĩ của tôi: Trục = n, trong đó n = 0, 1, v.v. có nghĩa là ma trận bị thu gọn (gấp lại) dọc theo trục đó. Vì vậy, trong ma trận 2D, khi bạn thu gọn dọc theo 0 (hàng), bạn thực sự đang hoạt động trên một cột tại một thời điểm. Tương tự cho ma trận bậc cao.

Đây không giống như tham chiếu bình thường cho thứ nguyên trong ma trận, trong đó 0 -> hàng và 1 -> cột. Tương tự cho các kích thước khác trong một mảng kích thước N.


0

Tôi là người mới chơi gấu trúc. Nhưng đây là cách tôi hiểu trục trong gấu trúc:


Hướng trục thay đổi liên tục


0 Hàng cột xuống dưới |


Cột 1 hàng hướng tới bên phải ->


Vì vậy, để tính giá trị trung bình của một cột, cột cụ thể đó phải là hằng số nhưng các hàng bên dưới có thể thay đổi (thay đổi) để nó là trục = 0.

Tương tự, để tính giá trị trung bình của một hàng, hàng cụ thể đó là hằng số nhưng nó có thể đi qua các cột khác nhau (khác nhau) , trục = 1.


0

Tôi nghĩ rằng có một cách khác để hiểu nó.

Đối với một np.array, nếu chúng ta muốn loại bỏ các cột, chúng ta sử dụng trục = 1; nếu chúng ta muốn loại bỏ các hàng, chúng ta sử dụng trục = 0.

np.mean(np.array(np.ones(shape=(3,5,10))),axis = 0).shape # (5,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = 1).shape # (3,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = (0,1)).shape # (10,)

Đối với đối tượng gấu trúc, axis = 0viết tắt của hoạt động theo hàng và axis = 1viết tắt của hoạt động theo cột. Điều này khác với numpyđịnh nghĩa, chúng ta có thể kiểm tra các định nghĩa từ numpy.docpandas.doc


0

Tôi rõ ràng sẽ tránh sử dụng 'hàng khôn ngoan' hoặc 'dọc theo các cột', vì mọi người có thể hiểu chúng theo cách chính xác.

Tương tự đầu tiên. Theo trực giác, bạn sẽ mong đợi pandas.DataFrame.drop(axis='column')thả một cột từ N cột và cung cấp cho bạn (N - 1) cột. Vì vậy, bây giờ bạn không thể chú ý đến các hàng (và xóa từ 'hàng' khỏi từ điển tiếng Anh của bạn.) Ngược lại, drop(axis='row')hoạt động trên các hàng.

Theo cùng một cách, sum(axis='column')hoạt động trên nhiều cột và cung cấp cho bạn 1 cột. Tương tự, sum(axis='row')kết quả trong 1 hàng. Điều này phù hợp với hình thức định nghĩa đơn giản nhất của nó, giảm danh sách các số thành một số duy nhất.

Nói chung, với axis=column, bạn thấy các cột, làm việc trên các cột và nhận các cột. Quên hàng.

Với axis=row, thay đổi quan điểm và làm việc trên các hàng.

0 và 1 chỉ là bí danh cho 'hàng' và 'cột'. Đó là quy ước của việc lập chỉ mục ma trận.


Giải thích này không đúng khi sử dụng trục = 'cột' không cung cấp cho bạn các cột.
dùng306557

@ user3065757 Cảm ơn các ý kiến. Bạn có thể vui lòng giải thích với các ví dụ?
lqu

Không phải bạn đang trả lời ai, nhưng khi tôi cố gắng tìm ra pd.concatlời giải thích của bạn, nó không hoạt động. Bạn có thể giải thích hành vi concat với 2 trục không? Cảm ơn.
Bowen Liu

@BowenLiu Khi bạn ghép 2 danh sách táo, bạn nhận được 1 danh sách nhiều táo hơn (nhưng không phải táo to hơn). Khi bạn nối các hàng (trục = 0), bạn sẽ nhận được nhiều hàng hơn (không phải hàng dài hơn); khi bạn nối các cột (trục = 1), bạn sẽ nhận được nhiều cột hơn (không phải cột dài hơn). Ý tưởng là trục = 0 hoạt động giữa các hàng, không nằm trong một hàng.
lqu

0

Tôi đã cố gắng tìm ra trục cho giờ cuối cùng là tốt. Ngôn ngữ trong tất cả các câu trả lời ở trên, và tài liệu cũng không hữu ích chút nào.

Để trả lời câu hỏi như tôi hiểu bây giờ, trong Pandas, trục = 1 hoặc 0 có nghĩa là bạn muốn giữ nguyên tiêu đề trục nào khi áp dụng hàm.

Lưu ý: Khi tôi nói tiêu đề, ý tôi là tên chỉ mục

Mở rộng ví dụ của bạn:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      X     | 0.626386| 1.52325|
+------------+---------+--------+
|      Y     | 0.626386| 1.52325|
+------------+---------+--------+

Đối với trục = 1 = cột: Chúng tôi giữ các tiêu đề cột không đổi và áp dụng hàm trung bình bằng cách thay đổi dữ liệu. Để chứng minh, chúng tôi giữ các tiêu đề cột không đổi như sau:

+------------+---------+--------+
|            |  A      |  B     |

Bây giờ chúng ta điền vào một tập hợp các giá trị A và B và sau đó tìm giá trị trung bình

|            | 0.626386| 1.52325|  

Sau đó, chúng tôi tập hợp các giá trị A và B tiếp theo và tìm giá trị trung bình

|            | 0.626386| 1.52325|

Tương tự, đối với trục = hàng, chúng tôi giữ các tiêu đề hàng không đổi và tiếp tục thay đổi dữ liệu: Để chứng minh, trước tiên hãy sửa các tiêu đề hàng:

+------------+
|      X     |
+------------+
|      Y     |
+------------+

Bây giờ, nhập tập hợp giá trị X và Y đầu tiên và sau đó tìm giá trị trung bình

+------------+---------+
|      X     | 0.626386
+------------+---------+
|      Y     | 0.626386
+------------+---------+

Sau đó, tập hợp các giá trị X và Y tiếp theo và sau đó tìm giá trị trung bình:

+------------+---------+
|      X     | 1.52325 |
+------------+---------+
|      Y     | 1.52325 |
+------------+---------+

Tóm tắt,

Khi trục = cột, bạn sửa các tiêu đề cột và thay đổi dữ liệu, sẽ đến từ các hàng khác nhau.

Khi trục = hàng, bạn sửa các tiêu đề hàng và thay đổi dữ liệu, sẽ đến từ các cột khác nhau.


0

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

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

trục = 1, Nó sẽ cung cấp cho hàng tổng khôn ngoan, keepdims = True sẽ duy trì kích thước 2D. Hy vọng nó sẽ giúp bạn.


Không phải OP mà cảm ơn. Tôi nghĩ rằng phần lớn sự nhầm lẫn mà mọi người có về điều này là, trong tài liệu của Pandas, trục = 1 tương ứng với các cột. Tuy nhiên, đây là cách tính toán 'hàng khôn ngoan'.
Bowen Liu

0

Nhiều câu trả lời ở đây đã giúp tôi rất nhiều!

Trong trường hợp bạn bị nhầm lẫn bởi các hành vi khác nhau của axisPython và MARGINtrong R (như trong applyhàm), bạn có thể tìm thấy một bài đăng blog mà tôi đã viết quan tâm: https://accio.github.io/programming/2020/05/ 19 / numpy-gấu trúc-trục.html .

Về bản chất:

  • Hành vi của họ, hấp dẫn, dễ hiểu hơn với mảng ba chiều so với mảng hai chiều.
  • Trong các gói Python numpypandas, tham số trục tổng hợp thực sự chỉ định numpy để tính giá trị trung bình của tất cả các giá trị có thể được tìm nạp ở dạng mảng [0, 0, ..., i, ..., 0] trong đó tôi lặp qua tất cả các giá trị có thể. Quá trình được lặp lại với vị trí của i được cố định và các chỉ số của các kích thước khác thay đổi theo từng chiều (từ phần tử cực hữu). Kết quả là một mảng n-1 chiều.
  • Trong R, tham số MARGINS cho phép applyhàm tính giá trị trung bình của tất cả các giá trị có thể được tìm nạp dưới dạng mảng [, ..., i, ...,] trong đó tôi lặp qua tất cả các giá trị có thể. Quá trình không được lặp lại khi tất cả các giá trị i đã được lặp lại. Do đó, kết quả là một vector đơn giản.

-6

Mảng được thiết kế với cái gọi là trục = 0 và các hàng được định vị theo chiều dọc so với trục = 1 và các cột được định vị theo chiều ngang. Trục đề cập đến kích thước của mảng. Hình minh họa


axis=0có nghĩa là mỗi hàng là một số lượng lớn, chúng tôi chỉ có thể thao tác liên hàng DataFrame thay vì hàng bên trong. axis=1có nghĩa là mỗi cột là một khối, chúng ta chỉ có thể thao tác giữa cột DataFrame thay vì cột bên trong.
Belter

5
Đây có phải là chính xác sai cách xung quanh theo hầu hết các mô tả khác trên trang này (và theo một thử nghiệm nhanh với gấu trúc trong Jupyter)?
Marc Liyanage

2
Điều này hoàn toàn ngược lại. Hãy sửa câu trả lời của bạn.
Sumit Pokhrel
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.