[python] Pandas Dataframe / Numpy Array “축”정의의 모호성

파이썬 축이 어떻게 정의되는지, 그리고 이들이 DataFrame의 행이나 열을 참조하는지에 대해 매우 혼란 스러웠습니다. 아래 코드를 고려하십시오.

>>> df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col1", "col2", "col3", "col4"])
>>> df
   col1  col2  col3  col4
0     1     1     1     1
1     2     2     2     2
2     3     3     3     3

따라서를 호출 df.mean(axis=1)하면 행에 걸쳐 평균을 얻을 수 있습니다.

>>> df.mean(axis=1)
0    1
1    2
2    3

그러나를 호출 df.drop(name, axis=1)하면 실제로 행이 아닌 column을 삭제합니다 .

>>> df.drop("col4", axis=1)
   col1  col2  col3
0     1     1     1
1     2     2     2
2     3     3     3

누군가가 pandas / numpy / scipy에서 “축”이 무엇을 의미하는지 이해하도록 도와 줄 수 있습니까?

참고로 DataFrame.mean잘못 정의되었을 수 있습니다. 것이 문서에 말한다 DataFrame.mean이가 axis=1열이 아닌 행에 걸쳐 평균을 뜻한다 …



답변

0 = down1 = across 로 기억하는 것이 가장 간단합니다 .

이것은 다음을 의미합니다.

  • axis=0각 열 아래 또는 행 레이블 (인덱스)에 메서드를 적용하는 데 사용 합니다.
  • axis=1각 행 또는 열 레이블에 방법을 적용하는 데 사용 합니다.

다음은 각 축이 참조하는 DataFrame의 부분을 보여주는 그림입니다.

Pandas가 NumPy의 단어 사용을 따른다는 것을 기억하는 것도 유용합니다 axis. 사용법은 NumPy의 용어집에 설명되어 있습니다 .

축은 차원이 두 개 이상인 배열에 대해 정의됩니다. 2 차원 배열에는 두 개의 해당 축이 있습니다. 첫 번째 축은 행을 가로 질러 수직 으로 아래로 이동하고 (축 0) 두 번째 축은 열을 가로 질러 가로로 이동합니다 (축 1) . [ 내 강조점 ]

따라서 질문의 방법과 관련하여는 df.mean(axis=1)올바르게 정의 된 것 같습니다. 열을 가로 질러 가로로 , 즉 각 개별 행을 따라 항목의 평균을 취합니다 . 반면에는 행에 걸쳐df.mean(axis=0) 수직 으로 아래쪽으로 작동하는 작업 입니다.

마찬가지로 df.drop(name, axis=1)가로 축을 직관적으로 가로 지르기 때문에 열 레이블에 대한 작업을 나타냅니다. 지정 axis=0하면 메서드가 대신 행에서 작동합니다.


답변

설명하는 또 다른 방법 :

// Not realistic but ideal for understanding the axis parameter
df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]],
                  columns=["idx1", "idx2", "idx3", "idx4"],
                  index=["idx1", "idx2", "idx3"]
                 )

---------------------------------------1
|          idx1  idx2  idx3  idx4
|    idx1     1     1     1     1
|    idx2     2     2     2     2
|    idx3     3     3     3     3
0

df.drop(축은 위치를 의미)

A: I wanna remove idx3.
B: **Which one**? // typing while waiting response: df.drop("idx3",
A: The one which is on axis 1
B: OK then it is >> df.drop("idx3", axis=1)

// Result
---------------------------------------1
|          idx1  idx2     idx4
|    idx1     1     1     1
|    idx2     2     2     2
|    idx3     3     3     3
0

정보 df.apply(축은 방향을 의미)

A: I wanna apply sum.
B: Which direction? // typing while waiting response: df.apply(lambda x: x.sum(),
A: The one which is on *parallel to axis 0*
B: OK then it is >> df.apply(lambda x: x.sum(), axis=0)

// Result
idx1    6
idx2    6
idx3    6
idx4    6


답변

이미 적절한 답이 있지만 2 차원을 초과하는 또 다른 예를 들겠습니다.

파라미터 axis변경할 축을 의미 합니다.
예를 들어 차원이 axbxc 인 데이터 프레임이 있다고 가정 합니다.

  • df.mean(axis=1)차원이 ax 1 xc 인 데이터 프레임을 반환합니다 .
  • df.drop("col4", axis=1)차원이 ax (b-1) xc 인 데이터 프레임을 반환합니다 .

여기서, axis=1상기 제 2 축선을 의미 b하므로, b값이 예에서 변화 될 것이다.


답변

문자열 별칭 ‘index’‘columns’ 를 정수 0/1 대신 사용할 수 있다는 것이 더 널리 알려져 있습니다. 별칭은 훨씬 더 명확하며 계산이 어떻게 수행되는지 기억하는 데 도움이됩니다. ‘index’의 또 다른 별칭은 ‘rows’ 입니다.

axis='index'사용되며, 다음 계산은 혼란 열, 아래로 일어난다. 그러나 다른 행과 같은 크기의 결과를 얻는 것으로 기억합니다.

제가 말하는 내용을 확인하기 위해 화면에 데이터를 가져 오겠습니다.

df = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))
          a         b         c         d
0  0.990730  0.567822  0.318174  0.122410
1  0.144962  0.718574  0.580569  0.582278
2  0.477151  0.907692  0.186276  0.342724
3  0.561043  0.122771  0.206819  0.904330
4  0.427413  0.186807  0.870504  0.878632
5  0.795392  0.658958  0.666026  0.262191
6  0.831404  0.011082  0.299811  0.906880
7  0.749729  0.564900  0.181627  0.211961
8  0.528308  0.394107  0.734904  0.961356
9  0.120508  0.656848  0.055749  0.290897

모든 열의 평균 axis='index'을 얻으려면 다음을 사용 합니다.

df.mean(axis='index')
a    0.562664
b    0.478956
c    0.410046
d    0.546366
dtype: float64

동일한 결과는 다음과 같이 얻을 수 있습니다.

df.mean() # default is axis=0
df.mean(axis=0)
df.mean(axis='rows')

행에서 왼쪽에서 오른쪽으로 작업을 사용하려면 axis = ‘columns’를 사용하십시오. DataFrame에 추가 열이 추가 될 수 있다고 생각하여 기억합니다.

df.mean(axis='columns')
0    0.499784
1    0.506596
2    0.478461
3    0.448741
4    0.590839
5    0.595642
6    0.512294
7    0.427054
8    0.654669
9    0.281000
dtype: float64

동일한 결과는 다음과 같이 얻을 수 있습니다.

df.mean(axis=1)

축 = 0 / 인덱스 / 행으로 새 행 추가

이 결과를 사용하여 추가 행 또는 열을 추가하여 설명을 완료 해 보겠습니다. 따라서 axis = 0 / index / rows를 사용할 때마다 DataFrame의 새 행을 얻는 것과 같습니다. 행을 추가해 보겠습니다.

df.append(df.mean(axis='rows'), ignore_index=True)

           a         b         c         d
0   0.990730  0.567822  0.318174  0.122410
1   0.144962  0.718574  0.580569  0.582278
2   0.477151  0.907692  0.186276  0.342724
3   0.561043  0.122771  0.206819  0.904330
4   0.427413  0.186807  0.870504  0.878632
5   0.795392  0.658958  0.666026  0.262191
6   0.831404  0.011082  0.299811  0.906880
7   0.749729  0.564900  0.181627  0.211961
8   0.528308  0.394107  0.734904  0.961356
9   0.120508  0.656848  0.055749  0.290897
10  0.562664  0.478956  0.410046  0.546366

축 = 1 / 열로 새 열 추가

마찬가지로 axis = 1 / columns 일 때 자체 열로 쉽게 만들 수있는 데이터를 생성합니다.

df.assign(e=df.mean(axis='columns'))

          a         b         c         d         e
0  0.990730  0.567822  0.318174  0.122410  0.499784
1  0.144962  0.718574  0.580569  0.582278  0.506596
2  0.477151  0.907692  0.186276  0.342724  0.478461
3  0.561043  0.122771  0.206819  0.904330  0.448741
4  0.427413  0.186807  0.870504  0.878632  0.590839
5  0.795392  0.658958  0.666026  0.262191  0.595642
6  0.831404  0.011082  0.299811  0.906880  0.512294
7  0.749729  0.564900  0.181627  0.211961  0.427054
8  0.528308  0.394107  0.734904  0.961356  0.654669
9  0.120508  0.656848  0.055749  0.290897  0.281000

다음 개인 변수를 사용하여 모든 별칭을 볼 수 있습니다.

df._AXIS_ALIASES
{'rows': 0}

df._AXIS_NUMBERS
{'columns': 1, 'index': 0}

df._AXIS_NAMES
{0: 'index', 1: 'columns'}


답변

axis = ‘rows’또는 axis = 0이면 행 방향으로 요소에 액세스하는 것을 의미합니다. 축 = 0을 따라 합계를 적용하면 각 열의 합계가 제공됩니다.

axis = ‘columns’또는 axis = 1이면 왼쪽에서 오른쪽으로 열 방향으로 요소에 액세스하는 것을 의미합니다. axis = 1 따라 합계를 적용하면 각 행의 합계를 얻습니다.

아직도 혼란 스럽습니다! 그러나 위의 내용은 나를 조금 더 쉽게 만듭니다.


답변

다른 모든 답변이 혼란 스럽습니다. 내가 그것에 대해 어떻게 생각하는지 :

axis=0: 결과의 모양이 수평 (행)
axis=1: 결과의 모양이 수직 (열)

그래서

  • df.drop(name, axis=1): 컬럼 삭제
  • df.mean(axis=1): 열을 계산합니다 (결과를 새 열로 추가 할 수 있음).


답변