NumPy/pandasのDataFrameでの転置行列

NumPyでの転置行列

2次元のndarrayで表現する行列の転置行列は T というメソッドで簡単に表現することができる。

\[ \mathbf{X} = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{pmatrix} \]

\[ \mathbf{X}^T = \begin{pmatrix} 1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9 \\ \end{pmatrix} \]

X = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])

print(X)
# 出力結果
# [[ 1.  2.  3.]
#  [ 4.  5.  6.]
#  [ 7.  8.  9.]]

t = X.T

print(t)
# 出力結果
# [[ 1.  4.  7.]
#  [ 2.  5.  8.]
#  [ 3.  6.  9.]]

T を一般化した swapaxesというメソッドもある。このメソッドは任意の軸を入れ替えることができる。以下の例では0番目の軸(外側の軸)と1番目の軸(内側の軸)を交換している。つまり、転置行列とまったく同じ。

print(X.swapaxes(0, 1))
# 出力結果
# [[ 1.  4.  7.]
#  [ 2.  5.  8.]
#  [ 3.  6.  9.]]

Tメソッドの結果はビューであるので、要素に値を代入すると、元の行列にも反映される。

t[1, 0] = 100

print(t)
# 出力結果
# [[   1.    4.    7.]
#  [ 100.    5.    8.]
#  [   3.    6.    9.]]

print(X)
# 出力結果
# [[   1.  100.    3.]
#  [   4.    5.    6.]
#  [   7.    8.    9.]]

swapaxesの例をもう少し挙げておくと、

# 3次元配列
ndarr1 = np.array([[[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]], [[11., 12., 13.], [14., 15., 16.], [17., 18., 19.]]])

print(ndarr1)
# 出力結果
# [[[  1.   2.   3.]
#   [  4.   5.   6.]
#   [  7.   8.   9.]]
# 
#  [[ 11.  12.  13.]
#   [ 14.  15.  16.]
#   [ 17.  18.  19.]]]

# 外側の軸と真ん中の軸を交換
print(ndarr1.swapaxes(0, 1))
# 出力結果
# [[[  1.   2.   3.]
#   [ 11.  12.  13.]]
# 
#  [[  4.   5.   6.]
#   [ 14.  15.  16.]]
# 
#  [[  7.   8.   9.]
#   [ 17.  18.  19.]]]

# 真ん中の軸と内側の軸を交換
print(ndarr1.swapaxes(1, 2))
# 出力結果
# [[[  1.   4.   7.]
#   [  2.   5.   8.]
#   [  3.   6.   9.]]
# 
#  [[ 11.  14.  17.]
#   [ 12.  15.  18.]
#   [ 13.  16.  19.]]]

# 外側の軸と内側の軸を交換
print(ndarr1.swapaxes(0, 2))
# 出力結果
# [[[  1.  11.]
#   [  4.  14.]
#   [  7.  17.]]
# 
#  [[  2.  12.]
#   [  5.  15.]
#   [  8.  18.]]
# 
#  [[  3.  13.]
#   [  6.  16.]
#   [  9.  19.]]]

pandasのDataFrameでの転置行列

T というメソッドはNumPyのndarrayだけでなく、pandasのDataFrameでもそのまま使える。

import pandas as pd

df1 = pd.DataFrame(
    {'name': ['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle'],
     'age': [29, 24, 29, 10, 5, 0],
     'sex': ['m', 'm', 'm', 'f', 'f', 'f']},
    columns=['name', 'age', 'sex'])
print(df1)
# 出力結果
#        name  age sex
# 0     Danny   29   m
# 1      Jess   24   m
# 2      Joey   29   m
# 3      D.J.   10   f
# 4     Steph    5   f
# 5  Michelle    0   f

print(df1.T)
# 出力結果
#           0     1     2     3      4         5
# name  Danny  Jess  Joey  D.J.  Steph  Michelle
# age      29    24    29    10      5         0
# sex       m     m     m     f      f         f

DataFrameのTメソッドは、NumPyのとは違って、結果を変更してももとのDataFrameを変更しないみたい。

df1.T[0]["age"] = 30
print(df1)
# 出力結果は最初のと変わらず
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。