パンダの軸はどういう意味ですか?


269

データフレームを生成するためのコードは次のとおりです。

import pandas as pd
import numpy as np

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

それから私はデータフレームを手に入れました:

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

コマンドを入力すると:

dff.mean(axis=1)

私は得た:

0    1.074821
dtype: float64

パンダのリファレンスによると、axis = 1は列を表し、コマンドの結果は

A    0.626386
B    1.523255
dtype: float64

だからここに私の質問です:パンダの軸は何を意味していますか?

回答:


382

これは、軸を指定し、それに沿って手段が計算されます。デフォルトではaxis=0。これは、と一致しているnumpy.meanときに使用axis指定された明示的(IN numpy.meanここで、平坦化アレイ上に平均値を計算し、デフォルトで==なし軸ない)axis=0に沿って(すなわち、インデックスパンダで)、そしてaxis=1沿って。さらに明確にするために、axis='index'(の代わりにaxis=0)またはaxis='columns'(の代わりにaxis=1)を指定することを選択できます。

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

164
通常、axis = 0は「列方向」(およびaxis = 1は「行方向」)と言われますが、「行に沿って」と紛らわしいと思います。(ニース "pic"でも:))
Andy Hayden

11
@AndyHaydenええ、でも、これに初めて遭遇した人にとって、両方が少し混乱しているかもしれません;)
zhangxaochen

43
また、axis=0行に沿って集計することを示し、列に沿って集計することを示す理由axis=1は、データフレームにインデックスを付ける方法によるものです。でdf.iloc[row, column]rowインデックス位置0にあり、columnインデックス位置1にあるnumpyのは、凝集が「行方向」又は「列方向より意味をなすために開始を崩壊その軸の観点で考えているN次元、これを一般化」
トムQ.15年

11
私はまだ混乱しています。私が行う場合はdf.drop("A", axis = 1)、その後Aの列は削除されます。それはも「行単位」が、落下列A「列に沿って」ではありません
ytu

5
@ytu axis=0は各行をバルクとして意味し、内部行ではなくDataFrameの行間のみを操作できます。axis=1各列をバルクとして意味します。内部列ではなく、DataFrame列間のみを操作できます。したがって、を使用するとdf.drop("A", axis = 1)、列全体が削除されます。
Belter

106

これらの回答はこれを説明するのに役立ちますが、プログラマーではない人(つまり、データサイエンスのコースで初めてPythonを学習している私のような人)にとってはまだ完全に直感的ではありません。行と列に対して「に沿って」または「それぞれに」という用語を使用すると、混乱を招きます。

私にとってより理にかなっているのは、次のように言うことです。

  • 軸0は各列のすべての行に作用します
  • 軸1は各行のすべての列に作用します

したがって、軸0の平均は各列のすべての行の平均となり、軸1の平均は各行のすべての列の平均となります。

結局のところ、これは@zhangxaochenや@Michaelと同じことを言っていますが、私にとっては、内部化しやすくなっています。


混乱は、いわゆる「行為」のそれぞれの複雑さに起因すると思います。df.dropna(axis = 0)は、まず各行のすべての列をチェックしてから、それらの行をnullでドロップします。軸は最後のステップについて話しますが、私たちの脳は最初の部分に焦点を合わせます。
Shawn Chen

69

視覚化しましょう(いつも覚えています)、 ここに画像の説明を入力してください

パンダでは:

  1. axis = 0は「インデックス」に沿っていることを意味します。これは行単位の操作です。

dataframe1とdataframe2でconcat()操作を実行するために、dataframe1を取得し、dataframe1から最初の行を取り出して新しいDFに配置し、次にdataframe1から別の行を取り出して新しいDFに入れ、このプロセスを繰り返すまで、 dataframe1の下部に到達します。次に、dataframe2に対して同じプロセスを実行します。

基本的に、dataframe2をdataframe1の上に重ねたり、その逆を重ねたりします。

例えば、テーブルや床に本の山を作る

  1. axis = 1は「列」に沿っていることを意味します。これは列ごとの操作です。

dataframe1とdataframe2でconcat()演算を実行するために、dataframe1の最初の完全な列(別名1stシリーズ)を取り出して新しいDFに配置し、次にdataframe1の2番目の列を取り出してそれに隣接します(横向き) )、すべての列が終了するまでこの操作を繰り返す必要があります。次に、dataframe2に対して同じプロセスを繰り返します。基本的に、dataframe2を横向きスタックします。

たとえば、本棚に本を並べる。

さらに言えば、配列はネストされたn次元構造を表現するためのより良い表現なので、行列と比較して!そのため、以下は、複数の次元に一般化するときに軸がどのように重要な役割を果たすかを視覚化するのに役立ちます。また、実際には任意のn次元配列を印刷/書き込み/描画/視覚化できますが、行列表現(3-dim)でそれを書き込んだり視覚化したりすることは、3次元以上の用紙では不可能です。

ここに画像の説明を入力してください


6
この答えは正しいと思います。それを視覚化する必要があります。axis = 0(またはaxis = 'rows'は水平軸です。axis= 1(またはaxis = 'columns')は垂直軸です。さらに詳しく言えば、pandasメソッドdropを使用する場合は、列または行を削除します。 axis = 1は列を削除します。axis= 0を指定すると、データセットから行が削除されます。したがって、変数dfにパンダデータフレームがある場合、df.drop(0、axis = 0)は最初の行全体を削除しますデータセットdf.drop( 'grades'、axis = 1)は、データセットから列 'grades'を削除します。これにより、もう少し明確になりますように…
Roboblob

3
@Roboblob-まだ混乱しています。df.drop(n、axis = 1)は列に作用します。df.mean(axis = 1)が列に対してアクションを実行しないのはなぜですか?
マティ

@matty、まず!あなたの手を汚してください!、それはとても簡単です。参考までに、dropmean、axis = 1はどちらも同じです。例で何かを理解していない場合は、新しい質問をしてください!
Anu、

2
@anu-手を汚していますか?重複する質問でSOを散らかす必要はありません。この混乱を軽減するために、このページの1つ以上の回答を明確にできると確信しています。できれば自分でやるのですが、今のところ、使い方しかわかりません。必要なデータを取得するために使用する軸を理解しています。ただし、me​​an()とdrop()が反対の軸に影響を与えるように感じる理由については、混乱が残ります。
マット

2
この答えは信じられないほど混乱しています。行をaxis = 0として操作することについて話しますが、列を下る赤い矢印を描画します。列に作用するaxis = 1について話しますが、行を横切る矢印を描画します。このシステムを思いついた人は誰もそれをよく考えていませんでした。
rocksNwaves

33

axis配列の次元を指します。s pd.DataFrameの場合axis=0は、下を指す次元と右を指す次元ですaxis=1

例:ndarray with形状について考えてみましょう(3,5,7)

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

aは3次元ですndarray。つまり、3つの軸があります(「軸」は「軸」の複数形です)。の構成はa、パンの3つのスライスのようになります。各スライスは、5行7列の次元です。a[0,:,:]0番目のスライスを参照し、a[1,:,:]を参照し、1を参照します。

a.sum(axis=0)sum()の0番目の軸に沿って適用されますa。あなたはすべてのスライスを追加し、形の1つのスライスで終わります(5,7)ます。

a.sum(axis=0) に相当

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

bそして、a.sum(axis=0)なります。このように、両方の外観

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.]])

a pd.DataFrameでは、axesはnumpy.arrays と同じように機能しaxis=0ます。sum()機能します。各列にれます。

注: @zhangxaochenの回答では、「行に沿って」と「列に沿って」というフレーズが少し紛らわしいことに気づきました。axis=0「各列に沿って」およびaxis=1「各行に沿って」を参照する必要があります。


1
これは受け入れられた答えよりも良い答えです。Safakが使用されているフレーズについて言及しているように、言葉遣いが不十分であり、さらに混乱を招いているためです。
javadba

これはより良い答えです
Ravi G

24

私が理解する最も簡単な方法は、各列(axis = 0)または各行(axis = 1)の統計を計算しているかどうかについて話すことです。統計、たとえば平均を計算すると、axis = 0各列の統計が得られます。したがって、各観測値が行で、各変数が列にある場合、各変数の平均が得られます。設定axis = 1すると、各行の統計を計算します。この例では、すべての変数の各観測値の平均を取得します(おそらく、関連するメジャーの平均が必要です)。

axis = 0:列ごと=列ごと=行に沿って

axis = 1:行ごと=行ごと=列に沿って


「along」は「across」に置き換えるべきだと思います。何か(たとえば道路)に沿って行くということは、それに留まることを意味しますがaxis=0、たとえば、平均を計算するときに、say行に留まることはありません。むしろ、列内のすべての行にまたがっています。
交絡

13

Wikiの表を見てみましょう。これは、IMFが2010年から2019年までの上位10か国のGDPを推定したものです。 ここに画像の説明を入力してください

1.軸1はすべての列の各行に対して機能します。
10年間(2010〜2019年)の各国の平均(平均)GDPを計算する場合は、を実行する必要がありますdf.mean(axis=1)。たとえば、2010年から2019年までの米国の平均GDPを計算する場合、df.loc['United States','2010':'2019'].mean(axis=1)

2.軸0はすべての行の各列に対して機能します。すべての国の各年
の平均(平均)GDPを計算する場合は、を実行する必要がありますdf.mean(axis=0)。たとえば、米国、中国、日本、ドイツ、インドの2015年の平均GDPを計算する場合、df.loc['United States':'India','2015'].mean(axis=0)

注:上記のコードは、「国(または依存する地域)」列をインデックスとして設定した後にのみ機能します。set_index方法。


11

プログラミングの観点から見た軸は、形状タプル内の位置です。次に例を示します。

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)

軸の平均は、その寸法を削除します。

元の質問を参照すると、dffの形状は(1,2)です。axis = 1を使用すると、形状が(1)に変わります。


8

パンダの設計者であるウェスマッキーニーは、以前は財務データに集中して取り組んでいました。列を株名、インデックスを日次価格と考えてください。次にaxis=0、この財務データに関するデフォルトの動作(つまり、)を推測できます。axis=1単に「反対方向」と考えることができます。

たとえば、などの統計関数は、mean()sum()describe()count()列方向にすべてのデフォルトでは、各株式のためにそれらを行うには、より理にかなっているため。sort_index(by=)また、デフォルトは列です。fillna(method='ffill')同じ在庫ですので列に沿って記入します。dropna()その株式の価格をすべて捨てるのではなく、おそらくその日の価格を破棄したいだけなので、デフォルトは行です。

同様に、角かっこインデックスは、1日ではなく株式を選択する方が一般的であるため、列を参照します。


1
あなたの推論は正しいように聞こえますが、mean()、sum()およびその他の関数はデフォルトで(軸= 0)に設定されています。そして、行方向は私たちが列方向に期待するように動作するようです:)そしてそれは混乱のようです。
bincob 2017年

5

軸1(列)と軸0(行)を思い出す簡単な方法の1つは、期待する出力です。

  • 各行の出力が予想される場合は、axis = 'columns'を使用します。
  • 一方、各列の出力が必要な場合は、axis = 'rows'を使用します。

ありがとう。ただし、これは計算でのみ機能しますか?pd.concator などの方法では機能しませんdf.dropna()。これは、より多くの識別機能でキーワーグ軸を使用するためです。
Bowen Liu

3

axis=適切に使用することの問題は、主に2つの異なるケースで使用することです。

  1. 累積値の計算、または並べ替えデータの(並べ替えなど)に使用します。
  2. 以下のための操作(と「遊ぶ」) 、エンティティ(例えばデータフレーム)。

この回答の背後にある主なアイデアは、混乱を避けるために、特定の軸を指定するために番号または名前のいずれかを、より明確で直感的で説明的なものを選択することです。

PandasはNumPyに基づいています。NumPyは、数学、特にn次元の行列に基づいています。これは、3次元空間での数学における軸の名前の一般的な使用のための画像です。

ここに画像の説明を入力してください この図は、軸の序数のみを記憶するためのものです。

  • 0 x軸の場合
  • 1 y軸、および
  • 2 z軸用。

z軸はのみのためのものであるパネル。以下のためにデータフレーム我々は緑色に関心制限する2次元の基本平面x軸(0垂直)、および(y軸を1水平)。

ここに画像の説明を入力してくださいパラメータの潜在的な値としての数値が すべてですaxis=

名前の軸がある'index'(エイリアスを使用することを'rows')と'columns'し、この説明のためには、これらの名前と順序数との関係は重要ではありません誰もが知っている(軸)、どのような言葉「行」「列」の平均(そして、ここのみんな-私はおそらく- パンダの「インデックス」という言葉が何を意味するか知っています)。

そして今、私の推薦:

  1. 累積値計算する場合は軸0沿って(または軸1に沿って)配置された値から計算できます-使用axis=0(またはaxis=1)。

    同様に、再配置する場合は、軸の軸番号を使用します。軸番号沿って、再配置(並べ替えなど)のためのデータが配置されます。

  2. あなたがしたい場合は、操作(例えばCONCATENATEエンティティ(例えばデータフレームを使用- ) axis='index':(同義語のaxis='rows'か)axis='columns'を指定した変更 - インデックス)または列のそれぞれを、。
    連結の場合は、より長いインデックス(=より多くの行)またはより多くの列をそれぞれ取得します。)


これが最良の答えであり、おそらく操作員によって正しい答えとしてマークされるべきです!
アンゼ

2

これは@Safakの回答に基づいています。pandas / numpyの軸を理解する最良の方法は、3D配列を作成し、3つの異なる軸に沿って合計関数の結果を確認することです。

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

aは:

    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.]]])

次に、各軸に沿った配列の要素の合計を確認します。

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

次の結果が得られます。

   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

私はこのように理解します:

たとえば、データフレーム内で左から右へ、または右から左へのトラバースが必要な操作の場合、列をマージしているようです。さまざまな列を操作しています。これは軸= 1です

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

ここで注意すべき点は、カラムを操作していることです

同様に、データフレーム内で操作を上から下/下から上にトラバースする必要がある場合は、行をマージしています。これはaxis = 0です。


1

軸= 0は上から下を意味します軸= 1は左から右を意味します

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

与えられた例は、列==キーのすべてのデータの合計を取ることです。


0

私の考え:Axis = n、n = 0、1などは、マトリックスがその軸に沿って折りたたまれている(折りたたまれている)ことを意味します。したがって、2Dマトリックスでは、0(行)に沿って折りたたむと、実際には一度に1つの列を操作しています。同様に、より高次の行列の場合。

これは、マトリックスの次元への通常の参照とは異なります。0->行および1->列です。N次元配列の他の次元についても同様です。


0

私はパンダの初心者です。しかし、これは私がパンダの軸を理解する方法です:


定数 変動 方向


下に0列の行|


右に向かって1行の列->


したがって、列の平均を計算するには、その特定の列は定数でなければなりませんが、その下の行は変化する可能性があります(可変)する可能性があるため、axis = 0になります。

同様に、行の平均を計算する場合、その特定の行は一定ですが、異なる列(可変)をトラバースできます axis = 1)。


0

それを理解する別の方法があると思います。

np.arrayの場合、列を削除するには、axis = 1を使用します。行を削除する場合は、axis = 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,)

pandasオブジェクトの場合、axis = 0行単位の操作をaxis = 1表し、列単位の操作を表します。これはnumpy定義とは異なり、numpy.docおよびpandas.docから定義を確認できます


0

「行単位」または「列に沿って」を使用することは明示的に避けます。人々がそれらをまったく間違った方法で解釈する可能性があるからです。

最初に類推。直感的には、pandas.DataFrame.drop(axis='column')N列から列を削除し、(N-1)列を提供すると予想されます。したがって、今のところ行に注意を払う必要はありません(英語の辞書から単語「行」を削除してください)。逆もまた同様です。drop(axis='row')です。

同様に、sum(axis='column')複数の列で機能し、1つの列を提供します。同様に、sum(axis='row')結果は1行になります。これは、最も単純な定義形式と一致しており、数値のリストを1つの数値に減らします。

一般的に、を使用するとaxis=column、列が表示され、列を操作して、列を取得できます。行を忘れます。

を使用してaxis=row、視点を変更し、行で作業します。

0と1は、「行」と「列」の単なるエイリアスです。これは、行列のインデックス付けの規則です。


この解釈は、axis = 'columns'を使用しても正しくありません。列は表示されません。
user3065757

@ user3065757コメントをありがとう。例で詳しく説明してもらえますか?
lqu

誰に返信しているのかではありませんが、私pd.concatがあなたの説明で理解しようとすると、うまくいきません。2つの軸で連結動作を説明できますか?ありがとう。
Bowen Liu

@BowenLiuりんごの2つのリストを連結すると、より多くのりんごの1つのリストが得られます(ただし大きなりんごはできません)。行を連結すると(axis = 0)、より多くの行が取得されます(長い行ではありません)。列を連結すると(axis = 1)、(より長い列ではなく)より多くの列が得られます。アイデアは、axis = 0は行内ではなく行間で動作することです。
lqu

0

この1時間も軸を理解しようとしています。上記のすべての回答の言語、およびドキュメントもまったく役に立ちません。

今私が理解している質問に答えるために、パンダでは、axis = 1または0は、関数を適用するときにどの軸ヘッダーを一定に保ちたいかを意味します。

注:ヘッダーとは、インデックス名を意味します

あなたの例を拡張する:

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

axis = 1 = columnsの場合:列ヘッダーを一定に保ち、データを変更して平均関数を適用します。実例として、列ヘッダーを次のように一定に保ちます。

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

次に、AとBの値の1つのセットを入力して、平均を求めます。

|            | 0.626386| 1.52325|  

次に、AとBの値の次のセットを入力し、平均を見つけます

|            | 0.626386| 1.52325|

同様に、axis = rowsの場合、行ヘッダーを一定に保ち、データを変更し続けます。例として、まず行ヘッダーを修正します。

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

XとYの値の最初のセットを入力してから、平均を見つけます

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

次に、X値とY値の次のセットを入力して、平均を見つけます。

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

要約すれば、

axis = columnsの場合、列ヘッダーを修正し、異なる行からのデータを変更します。

axis = rowsの場合、行ヘッダーを修正し、異なる列からのデータを変更します。


0

ここに画像の説明を入力してください

ここに画像の説明を入力してください

axis = 1、それは合計を行に与え、keepdims = Trueは2D次元を維持します。お役に立てば幸いです。


OPではなく、ありがとうございます。これに関する人々の混乱の大部分は、パンダスのドキュメンタリーでは、軸= 1は列に対応していると思います。ただし、ここでは「行ごと」の計算を行っています。
Bowen Liu

0

ここでの多くの回答が私を大いに助けてくれました!

axisPythonとMARGINRの(apply関数のように)のさまざまな動作に混乱する場合は、私が興味を持って書いたブログ投稿を見つけることができます:https : //accio.github.io/programming/2020/05/ 19 / numpy-pandas-axis.html

本質的に:

  • 興味深いことに、2次元配列よりも3次元配列の方が動作がわかりやすいです。
  • Pythonパッケージnumpyおよびpandasでは、sumのaxisパラメータは実際にnumpyを指定して、array [0、0、...、i、...、0]の形式でフェッチできるすべての値の平均を計算します。すべての可能な値。このプロセスはiの位置を固定して繰り返され、他の次元のインデックスは(最も右の要素から)次々と変化します。結果はn-1次元配列です。
  • Rでは、MARGINSパラメータを使用して、applyフェッチ可能なすべての値の平均をarray [、...、i、...、]の形式で関数で計算できます。ここで、iはすべての可能な値を繰り返し処理します。すべてのi値が反復されている場合、このプロセスは繰り返されません。したがって、結果は単純なベクトルです。

-6

配列は、いわゆるaxis = 0で行が垂直に配置されているのに対して、axis = 1で列が水平に配置されているように設計されています。軸は配列の次元を指します。 図


axis=0各行をバルクとして意味します。内部行ではなく、DataFrameの行間のみを操作できます。axis=1各列が一括であるという意味です。内部列ではなく、DataFrame列間のみを操作できます。
Belter

5
これは、このページの他のほとんどすべての説明(およびJupyterのパンダを使用したクイックテスト)によると、まったく間違った方法ではありませんか?
Marc Liyanage

2
これは正反対です。正解してください。
Sumit Pokhrel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.