web-dev-qa-db-ja.com

Pandas DataFrame?の「軸」属性の意味は何ですか?

次の例を取り上げます。

_>>> df1 = pd.DataFrame({"x":[1, 2, 3, 4, 5], 
                        "y":[3, 4, 5, 6, 7]}, 
                      index=['a', 'b', 'c', 'd', 'e'])

>>> df2 = pd.DataFrame({"y":[1, 3, 5, 7, 9], 
                        "z":[9, 8, 7, 6, 5]}, 
                      index=['b', 'c', 'd', 'e', 'f'])

>>> pd.concat([df1, df2], join='inner')
_

出力は次のとおりです。

_   y
a  3
b  4
c  5
d  6
e  7
b  1
c  3
d  5
e  7
f  9
_

_axis=0_は列なので、concat()は両方のデータフレームにあるcolumnsのみを考慮すると思います。ただし、実際の出力では、両方のデータフレームにあるが考慮されます。

axisパラメーターの正確な意味は何ですか?

20
lxdthriller

誰かが視覚的な説明が必要な場合、画像は次のとおりです。

Axis 0 or 1 in Pandas Python

24
debaonline4u

データ:

In [55]: df1
Out[55]:
   x  y
a  1  3
b  2  4
c  3  5
d  4  6
e  5  7

In [56]: df2
Out[56]:
   y  z
b  1  9
c  3  8
d  5  7
e  7  6
f  9  5

連結水平(軸= 1)、インデックス要素を使用して、両方のDFにあります(結合のためにインデックスで整列):

In [57]: pd.concat([df1, df2], join='inner', axis=1)
Out[57]:
   x  y  y  z
b  2  4  1  9
c  3  5  3  8
d  4  6  5  7
e  5  7  7  6

連結垂直(デフォルト:axis = 0)、両方のDFにあるcolumnsを使用:

In [58]: pd.concat([df1, df2], join='inner')
Out[58]:
   y
a  3
b  4
c  5
d  6
e  7
b  1
c  3
d  5
e  7
f  9

inner結合メソッドを使用しない場合、次のようになります。

In [62]: pd.concat([df1, df2])
Out[62]:
     x  y    z
a  1.0  3  NaN
b  2.0  4  NaN
c  3.0  5  NaN
d  4.0  6  NaN
e  5.0  7  NaN
b  NaN  1  9.0
c  NaN  3  8.0
d  NaN  5  7.0
e  NaN  7  6.0
f  NaN  9  5.0

In [63]: pd.concat([df1, df2], axis=1)
Out[63]:
     x    y    y    z
a  1.0  3.0  NaN  NaN
b  2.0  4.0  1.0  9.0
c  3.0  5.0  3.0  8.0
d  4.0  6.0  5.0  7.0
e  5.0  7.0  7.0  6.0
f  NaN  NaN  9.0  5.0
11
MaxU

これは軸に関する私のトリックです:操作を頭に追加するだけで、明確に聞こえます:

  • 軸0 =行
  • 軸1 =列

Axis = 0で「合計」すると、すべての行が合計され、出力は同じ列数の単一行になります。 axis = 1を「合計」すると、すべての列が合計され、出力は同じ行数の単一の列になります。

5
Rod292

まず、OPは自分のデータフレームの行と列を誤解していました。

ただし、実際の出力では、両方のデータフレームで見つかった行が考慮されます(唯一の一般的な行要素 'y')

OPは、ラベルyは行用であると考えました。ただし、yは列名です。

_df1 = pd.DataFrame(
         {"x":[1, 2, 3, 4, 5],  # <-- looks like row x but actually col x
          "y":[3, 4, 5, 6, 7]}, # <-- looks like row y but actually col y
          index=['a', 'b', 'c', 'd', 'e'])
print(df1)

            \col   x    y
 index or row\
          a       1     3   |   a
          b       2     4   v   x
          c       3     5   r   i
          d       4     6   o   s
          e       5     7   w   0

               -> column
                 a x i s 1
_

辞書では、yxが2行であるように見えるため、誤解されやすいです。

リストのリストから_df1_を生成する場合、より直感的になります。

_df1 = pd.DataFrame([[1,3], 
                    [2,4],
                    [3,5],
                    [4,6],
                    [5,7]],
                    index=['a', 'b', 'c', 'd', 'e'], columns=["x", "y"])
_

問題に戻ると、concatconcatenateの省略形です(この方法でシリーズまたはチェーンでリンクすることを意味します [ソース]concatalong軸0を実行すると、2つのオブジェクトをリンクすることを意味しますalong軸0。

_   1
   1   <-- series 1
   1
^  ^  ^
|  |  |               1
c  a  a               1
o  l  x               1
n  o  i   gives you   2
c  n  s               2
a  g  0               2
t  |  |
|  V  V
v 
   2
   2   <--- series 2
   2
_

だから...あなたは今感じていると思う。パンダの sum 関数はどうですか? sum(axis=0)はどういう意味ですか?

データが次のように見えるとします

_   1 2
   1 2
   1 2
_

たぶん... summingalongaxis 0、あなたは推測するかもしれません。はい!!

_^  ^  ^
|  |  |               
s  a  a               
u  l  x                
m  o  i   gives you two values 3 6 !
|  n  s               
v  g  0               
   |  |
   V  V
_

dropna についてはどうですか?データがあるとします

_   1  2  NaN
  NaN 3   5
   2  4   6
_

そして、あなただけを保ちたい

_2
3
4
_

ドキュメントでは、と言い、特定の軸のラベルが省略されたオブジェクトを返し、代わりにデータの一部またはすべてが欠落している

dropna(axis=0)またはdropna(axis=1)を配置する必要がありますか?それについて考えて、試してみてください

_df = pd.DataFrame([[1, 2, np.nan],
                   [np.nan, 3, 5],
                   [2, 4, 6]])

# df.dropna(axis=0) or df.dropna(axis=1) ?
_

ヒント:Wordalongについて考えてください。

3
Tai

Axis = 0を解釈して、各列にアルゴリズムを適用するか、行ラベル(インデックス)に適用します。より詳細なスキーマ here

その一般的な解釈をケースに適用する場合、ここでのアルゴリズムはconcatです。したがって、axis = 0の場合、次のことを意味します。

各列について、すべての行を下に(concatのすべてのデータフレームにわたって)取り、それらが共通であるときにそれらに連絡します(join=innerを選択したため) )。

したがって、意味は、すべての列xを取得し、それらを行に連結して、行の各チャンクを次々にスタックすることです。ただし、ここxはどこにも存在しないため、最終結果のために保持されません。 zにも同じことが当てはまります。 yの場合、結果はyがすべてのデータフレームにあるため保持されます。これが結果です。

3
Boud