これがデータフレームを生成するためのコードです。
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
だからここに私の質問です:パンダの軸はどういう意味ですか?
軸を指定しますに沿って平均が計算されます。デフォルトではaxis=0
。これは、axis
が指定されているときのnumpy.mean
の使用法と一貫していますexplicitly(in numpy.mean
、axis == Noneデフォルトでは、平坦化された配列の平均値を計算します。この場合、rowsに沿ってaxis=0
(つまり、indexin pandas)、およびaxis=1
に沿ってcolumns。明確にするために、axis='index'
(axis=0
の代わりに)またはaxis='columns'
(axis=1
の代わりに)を指定することもできます。
+------------+---------+--------+
| | A | B |
+------------+---------+---------
| 0 | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
| |
| axis=0 |
↓ ↓
これらの答えはこれを説明するのに役立ちますが、それでも非プログラマー(つまり、データサイエンスコースワークの文脈で初めてPythonを学んでいる私のような人)にとっては完全に直感的ではありません。行や列に対して「に沿って」または「それぞれに」という用語を使用しても混乱を招くことがあります。
私にとってもっと理にかなっているのは、こう言うことです。
したがって、軸0の平均は各列のすべての行の平均になり、軸1の平均は各行のすべての列の平均になります。
最終的にこれは@zhangxaochenや@Michaelと同じことを言っていますが、私にとっては内面化しやすい方法です。
パンダで:
Dataframe1とdataframe2に対してconcat()操作を実行するために、dataframe1とdataframe1から1行目を取り出して新しいDFに入れ、次にdataframe1から別の行を取り出して新しいDFに入れると仮定します。 dataframe1の一番下に到達します。その後、dataframe2についても同じ処理を行います。
基本的に、dataframe2をdataframe1の上に重ねるか、その逆にします。
例えばテーブルや床の上に本を積み重ねる
Dataframe1とdataframe2に対してconcat()操作を実行するために、dataframe1の1番目の完全な列(別名1シリーズ)を取り出し、新しいDFに配置するとします。 dataframe1の2列目とそれに隣接して(横に)、すべての列が終了するまでこの操作を繰り返す必要があります。その後、dataframe2で同じプロセスを繰り返します。基本的に、dataframe2を横に積み重ねる
例えば本棚に本を並べる
それ以上に、配列は行列と比較して入れ子になったn次元構造を表現するためのより良い表現なので!そのため、以下は、複数の次元に一般化するときに軸がどのように重要な役割を果たすかを視覚化するのに役立ちます。また、実際には任意のn-dim配列を印刷/書き込み/描画/視覚化することができますが、マトリックス表現(3-dim)で同じものを書いたり視覚化したりすることは、3次元以上の紙には不可能です。
axis
は配列の次元を指し、pd.DataFrame
の場合はaxis=0
は下を向く次元で、axis=1
は右を指す次元です。
例:(3,5,7)
という形のndarray
を考えてください。
a = np.ones((3,5,7))
a
は3次元のndarray
です。つまり、3軸です( "axes"は複数の "axis"です)。 a
の設定は3つのパンのスライスのように見えます。各スライスは5 x 7の大きさです。 a[0,:,:]
は0番目のスライスを参照し、a[1,:,:]
は1番目のスライスを参照します。
a.sum(axis=0)
は、a
の0番目の軸に沿ってsum()
を適用します。すべてのスライスを追加し、最後に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.]])
pd.DataFrame
では、Axesはnumpy.array
sと同じように機能します。axis=0
は、各列にsum()
またはその他の縮小関数を適用します。
N.B。@ zhangxaochenの答えの中で、「行に沿って」と「列に沿って」というフレーズは少し混乱します。 axis=0
は「各列に沿って」、そしてaxis=1
は各行に沿って参照する必要があります。
私にとって理解しやすい最も簡単な方法は、各列(axis = 0
)と各行(axis = 1
)のどちらで統計を計算しているのかを話すことです。統計量を計算する場合、平均値を言うと、axis = 0
で各列のその統計量が得られます。そのため、各観測値が行で各変数が列内にある場合は、各変数の平均値が得られます。 axis = 1
を設定した場合は、各行の統計を計算します。この例では、すべての変数にわたる各観測値の平均値を取得します(おそらく関連指標の平均値が必要です)。
axis = 0
:行に沿ってcolumn = column-wise =で
axis = 1
:列に沿ってrow = row-wise =で
プログラミング上の軸は、タプルの形の位置です。これが一例です。
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、)に変わります。
パンダのデザイナーであるWes McKinneyは、以前は財務データに集中的に取り組んでいました。列を銘柄名、インデックスを日々の価格と考えてください。これで、この財務データに関するデフォルトの動作(つまりaxis=0
)がどのようなものかを推測できます。 axis=1
は単に「他の方向」と考えることができます。
たとえば、mean()
、sum()
、describe()
、count()
などの統計関数は、デフォルトですべて列方向に設定されています。これは、株ごとにそれらを実行する方が理にかなっているためです。 sort_index(by=)
もデフォルトでcolumnになります。同じ在庫であるため、fillna(method='ffill')
は列に沿って記入されます。 dropna()
のデフォルトはrowです。これは、おそらくその株のすべての価格を捨てるのではなく、その日の価格を破棄したいだけだからです。
同様に、角括弧のインデックスは、日を選ぶのではなく株を選ぶ方が一般的であるため、列を参照します。
Wikiの表を見てみましょう。これは、上位10カ国の2010年から2019年までのGDPのIMF見積もりです。
1。軸1はすべての列の各行に作用します
10年間(2010年 - 2019年)にわたってEACH諸国の平均(平均)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
メソッドを使用して、インデックスとして "Country(or dependent territory)"列を設定した後でのみ機能します。
これは@ Safakの回答に基づいています。 pandas/numpyの軸を理解するための最良の方法は、3次元配列を作成し、3つの異なる軸に沿ってsum関数の結果を確認することです。
a = np.ones((3,5,7))
になります:
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.]])
axis = 0は上下方向を意味しますaxis = 1は左右方向を意味します
sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0)
与えられた例はcolumn ==キーの全てのデータの合計を取っています。
axis=
を適切に使用する場合の問題は、主に2つの異なるケースで使用するためです。
この答えの背後にある主なアイデアは、混乱を避けるために、特定の指定にnumberまたはnameを選択することです軸、、より明確で、直感的で、説明的な方
PandasはNumPyに基づいており、NumPyは数学、特にn次元行列に基づいています。以下は、3次元空間の数学で軸の名前を一般的に使用するための画像です。
0
x軸の場合、1
y軸、および2
はz軸用です。z-axisはpanels専用です; dataframesの場合、関心を緑色に限定します(= /// =)2次元の基本平面と x軸(0
、垂直)、およびy軸(1
、水平)
axis=
パラメータの潜在的な値としてのnumbersのすべてです。
軸のnamesは'index'
(エイリアス'rows'
を使用できます)および'columns'
です。この説明ではこれらの名前と序数(軸)の関係は重要ではありません。誰もが単語 "rows"および "columns"は、(そしてみんなhere-私は-Word "index"pandasの意味)。
そして今、私の推奨事項:
累積値を計算したい場合、軸0に沿って配置された値から計算できます(または軸1に沿って)-axis=0
(またはaxis=1
)を使用します。
同様に、値の再配置をしたい場合は、の軸番号を使用します軸、、それに沿って再配置用のデータが配置されます(たとえばsorting)。
manipulate(たとえばconcatenate)entities(例:dataframes)-axis='index'
(同義語:axis='rows'
)またはaxis='columns'
を使用して結果の変更-index(rows)またはcolumns。
(連結の場合、より長いインデックス(=より多くの行)またはさらに列、それぞれ。)
私はこのように理解しています:
データフレーム内で左から右へ/右から左へ移動する必要がある場合は、列を結合しているように見えます。あなたは様々なコラムに取り組んでいます。これは軸= 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
ここで注意しなければならないのは、カラムを操作しているということです。
同様に、データフレーム内で上から下/下から上に移動する必要がある場合は、行をマージします。これは軸= 0です。
軸1(列)と軸0(行)を覚える簡単な方法の1つは、期待する出力です。各行の出力が必要な場合はaxis = 'columns'を使用し、各列の出力が必要な場合はaxis = 'rows'を使用します。
私の考え:Axis = n、ここでn = 0、1などは、行列がその軸に沿って折りたたまれる(折りたたまれる)ことを意味します。そのため、2次元マトリックスでは、0(行)に沿って折りたたむと、実際には一度に1列ずつ操作します。高階行列についても同様です。
これは、0 - >行および1 - >列という、行列内の次元への通常の参照と同じではありません。 N次元配列の他の次元についても同様です。
私はそれを理解するための別の方法があると思います。
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,)
パンダオブジェクトの場合、axis = 0
は行方向の操作を表し、axis = 1
は列方向の操作を表します。これはnumpy
と定義が異なります。 numpy.doc と pandas.doc から定義をチェックできます。
私はパンダの初心者です。しかし、これは私がパンダの軸を理解する方法です:
軸定数可変方向
0列の行
右に1行の列 - >
そのため、列の平均を計算するには、その特定の列は定数である必要がありますが、その下の行は(変化します) )なのでaxis = 0です。
同様に、行の平均を計算するために、その特定の行は定数ですが、異なる列を通過することもできます(変化します) )、軸= 1.