note.nkmk.me

pandas.DataFrameの行と列を入れ替える(転置)

Date: 2018-01-12 / Modified: 2019-09-08 / tags: Python, pandas

pandas.DataFrameの行と列を入れ替えたい(=転置させたい)場合は、T属性かtranspose()メソッドを使う。

どちらの方法も元のオブジェクトは変更されず、行と列が入れ替わった(=転置された)新たなオブジェクトが返される。各列のデータ型dtypeによってはコピーではなくビューが生成され、元のオブジェクトと転置されたオブジェクトの一方の値を変更するともう一方の値も変更されるので注意。

以下の内容について説明する。

  • pandas.DataFrame.T
  • pandas.DataFrame.transpose()
  • 元のオブジェクト自体を変更したい場合
  • ビューとコピー

例として、以下のデータを使用する。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv').head(3)
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70

サンプルのcsvファイルはコチラ。

スポンサーリンク

pandas.DataFrame.T

df_t = df.T
print(df_t)
#            0    1        2
# name   Alice  Bob  Charlie
# age       24   42       18
# state     NY   CA       CA
# point     64   92       70

pandas.DataFrame.transpose()

df_tr = df.transpose()
print(df_tr)
#            0    1        2
# name   Alice  Bob  Charlie
# age       24   42       18
# state     NY   CA       CA
# point     64   92       70

元のオブジェクト自体を変更したい場合

元のオブジェクト自体を変更するinplaceのような引数は用意されていない。新たなオブジェクトを生成したくない場合は元のオブジェクト自体に代入すればよい。

df = df.T
print(df)
#            0    1        2
# name   Alice  Bob  Charlie
# age       24   42       18
# state     NY   CA       CA
# point     64   92       70

ビューとコピー

これまでの例のように列ごとにデータ型dtypeが異なる場合、Ttranspose()はコピーを生成する。元のオブジェクトと転置されたオブジェクトの一方の値を変更しても、もう一方はそのまま。

df = pd.read_csv('data/src/sample_pandas_normal.csv').head(3)
df_t = df.T

df.at[0, 'age'] = 100

print(df)
#       name  age state  point
# 0    Alice  100    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70

print(df_t)
#            0    1        2
# name   Alice  Bob  Charlie
# age       24   42       18
# state     NY   CA       CA
# point     64   92       70

すべての列が同じデータ型dtypeの場合、Ttranspose()はデフォルトではコピーではなくビューを生成する。元のオブジェクトと転置されたオブジェクトのどちらか一方の値を変更するともう一方の値も変更される。

df_ = pd.DataFrame(pd.np.arange(6).reshape(2, 3))
print(df_)
#    0  1  2
# 0  0  1  2
# 1  3  4  5

df_t_ = df_.T
print(df_t_)
#    0  1
# 0  0  3
# 1  1  4
# 2  2  5

df_.iat[0, 0] = 100

print(df_)
#      0  1  2
# 0  100  1  2
# 1    3  4  5

print(df_t_)
#      0  1
# 0  100  3
# 1    1  4
# 2    2  5

その後の処理で転置した方しか使わないのであれば特に気にしなくてもよいが、元のオブジェクトも転置したオブジェクトを別々に扱いたい場合、Tではcopy()で明示的にコピーを生成する。

df_ = pd.DataFrame(pd.np.arange(6).reshape(2, 3))
df_t_copy = df_.T.copy()

df_.iat[0, 0] = 100

print(df_)
#      0  1  2
# 0  100  1  2
# 1    3  4  5

print(df_t_copy)
#    0  1
# 0  0  3
# 1  1  4
# 2  2  5

transpose()では引数copyTrueとすると常にコピーが生成される。

df_ = pd.DataFrame(pd.np.arange(6).reshape(2, 3))
df_t_copy = df_.transpose(copy=True)

df_.iat[0, 0] = 100

print(df_)
#      0  1  2
# 0  100  1  2
# 1    3  4  5

print(df_t_copy)
#    0  1
# 0  0  3
# 1  1  4
# 2  2  5

デフォルトはcopy=Falseで、可能な場合はコピーではなくビューを生成する。最初の例のように列ごとにデータ型dtypeが異なるときはデフォルト(copy=False)であってもコピーが生成される。必ずビューとなるわけではない。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事