Pandasのインデックスとカラム

スポンサーリンク
スポンサーリンク

インデックス(index)

はじめに

複数のインデックスのことをPandasではマルチインデックス(MultiIndex)と言いますが、このページでは説明していません。
マルチインデックス(MultiIndex)ついては、以下を参照してください。
Pythonのマルチインデックス(MultiIndex)

インデックス名を取得

インデックスとカラム名をリスト型で取得します。

  • df.index:インデックス
df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"], index = ["age", "type"])

print(df)
#       aaa  bbb  ccc
# age     1    2    3
# type    4    5    6

# インデックス
print(df.index)
# Index(['age', 'type'], dtype='object')

インデックスの一覧を取得

df.indexでインデックスの一覧を取得できます。あまり利用シーンはないですが。。。

data = {"Tokyo":[1,2,3], "Osaka":[4,5,6], "Kyoto":[7,8,9]}
df = pd.DataFrame.from_dict(data, orient='index', columns = ["aaa", "bbb", "ccc"])

print(df)
#        aaa  bbb  ccc
# Tokyo    1    2    3
# Osaka    4    5    6
# Kyoto    7    8    9

print(df.index)
# Index(['Tokyo', 'Osaka', 'Kyoto'], dtype='object')

if 'Tokyo' in df.index:
    print("YES")

インデックスを作成(設定)

指定した列をインデックスにします。

df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"])
df = df.set_index('aaa')
print(df)
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

df = pd.DataFrame([["2020/05/01 12:34:56",1,True],["2020/05/01 16:34:56",4,False]], columns = ["Date Time", "bbb", "ccc"])
df['Date Time']  = pd.to_datetime(df['Date Time'])
df = df.set_index('Date Time')
print(df)
#                      bbb    ccc
# Date Time                      
# 2020-05-01 12:34:56    1   True
# 2020-05-01 16:34:56    4  False

指定した列を日時データに変換してインデックスに

df = pd.DataFrame([["2020/05/01 12:34:56",1,True],["2020/05/01 16:34:56",4,False]], columns = ["Date Time", "bbb", "ccc"])
df.index = pd.DatetimeIndex(pd.to_datetime(df['Date Time']), name='Date Time')
print(df)
#                                Date Time  bbb    ccc
# Date Time                                           
# 2020-05-01 12:34:56  2020/05/01 12:34:56    1   True
# 2020-05-01 16:34:56  2020/05/01 16:34:56    4  False
先程のdf.set_indexと大差はないですが、一行で済みます。ただ元の列が残るので削除が必要です。
削除は以下の一行でいいです。

del df['Date Time']

日付のいろいろなインデックス

複数のインデックスのことをPandasではマルチインデックス(MultiIndex)と言います。
詳しくは、以下を参照してください。
Pythonのマルチインデックス(MultiIndex)

df = pd.DataFrame([["2020/05/01 12:34:56",1,True],["2020/05/01 16:34:56",4,False]], columns = ["Date Time", "bbb", "ccc"])
df.index = pd.DatetimeIndex(pd.to_datetime(df['Date Time']), name='Date Time')

# 年と月のインデックスを追加
df = df.set_index([df.index, df.index.year, df.index.month]) 

# 元の列を削除
del df['Date Time']

# インデックスの名前を変更
df.index.names = ['Date Time', 'Year', 'Month']
print(df)
#                                 bbb    ccc
# Date Time           Year Month            
# 2020-05-01 12:34:56 2020 5        1   True
# 2020-05-01 16:34:56 2020 5        4  False
少し長くなりましたが、一行だけです。
年や月以外に主なもので以下があり、活用すればシストレに役立てます。

df.index.weekday # 曜日 *0~6(月曜日が0
df.index.weekday_name # 曜日 * ‘Monday’, ‘Tuesday’
df.index.year # 年
df.index.quarter # 四半期*1~4
df.index.month # 月
df.index.day # 日
その他は、以下のドキュメントを参照してください。
Site not found · GitHub Pages

インデックス名の変更

個別

data = {"Tokyo":[1,2,3], "Osaka":[4,5,6], "Kyoto":[7,8,9]}
df = pd.DataFrame.from_dict(data, orient='index')

print(df)
#        0  1  2
# Tokyo  1  2  3
# Osaka  4  5  6
# Kyoto  7  8  9

df = df.rename(index={'Tokyo': 'After'}) # 列

print(df)
#        0  1  2
# After  1  2  3
# Osaka  4  5  6
# Kyoto  7  8  9
カラム名とインデックス名を同時に変更するには、以下でできます。
df = df.rename(columns={'A': 'a'}, index={'ONE': 'one'})

インデックス名を設定

data = {"Tokyo":[1,2,3], "Osaka":[4,5,6], "Kyoto":[7,8,9]}
df = pd.DataFrame.from_dict(data, orient='index')

print(df)
#        0  1  2
# Tokyo  1  2  3
# Osaka  4  5  6
# Kyoto  7  8  9

df.index.name = 'city'
#        0  1  2
# city          
# Tokyo  1  2  3
# Osaka  4  5  6
# Kyoto  7  8  9
変更する時も同じように代入するだけです。

インデックスのタイプを確認

デバッグなんかで使うシーンがあると思います。

df = pd.DataFrame([["2020/05/01 12:34:56",1,True],["2020/05/01 16:34:56",4,False]], columns = ["Date Time", "bbb", "ccc"]) # リスト型のデータで作成
df.index = pd.DatetimeIndex(pd.to_datetime(df['Date Time']), name='Date Time')
del df['Date Time']

print(df)
#                      bbb    ccc
# Date Time                      
# 2020-05-01 12:34:56    1   True
# 2020-05-01 16:34:56    4  False

print(df.index.dtype)
# datetime64[ns]

インデックスを再設定

df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns = ["aaa", "bbb", "ccc"])
print(df)
#    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6
# 2    7    8    9
df = df.drop(0) # 一行目を削除
print(df)
#    aaa  bbb  ccc
# 1    4    5    6
# 2    7    8    9
df = df.reset_index(drop=True) # インデックスの再設定
print(df)
#    aaa  bbb  ccc
# 0    4    5    6
# 1    7    8    9

インデックスを解除

df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"])
df = df.set_index('aaa')
print(df)
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

df = df.reset_index()
print(df)
#    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6
設定してあったインデックスが削除され、その値が新たな列として作成されます。
新たな列として作成しない場合は、drop = Trueとします。

インデックスの値を列に代入

df.indexで値を取得できます。

df = pd.DataFrame([["2020/05/01 12:34:56",1,True],["2020/05/01 16:34:56",4,False]], columns = ["Date Time", "bbb", "ccc"]) # リスト型のデータで作成
df.index = pd.DatetimeIndex(pd.to_datetime(df['Date Time']), name='Date Time')
del df['Date Time']

print(df)
#                      bbb    ccc
# Date Time                      
# 2020-05-01 12:34:56    1   True
# 2020-05-01 16:34:56    4  False

df['aaa'] = df.index
print(df)
#                      bbb    ccc                 aaa
# Date Time                                          
# 2020-05-01 12:34:56    1   True 2020-05-01 12:34:56
# 2020-05-01 16:34:56    4  False 2020-05-01 16:34:56

日付型インデックスにタイムゾーンを設定

df = pd.DataFrame([["2020/05/01 12:34:56",1,True],["2020/05/01 16:34:56",4,False]], columns = ["Date Time", "bbb", "ccc"]) # リスト型のデータで作成
df.index = pd.DatetimeIndex(pd.to_datetime(df['Date Time']), name='Date Time')
del df['Date Time']
print(df)
#                      bbb    ccc
# Date Time                      
# 2020-05-01 12:34:56    1   True
# 2020-05-01 16:34:56    4  False
        
df.index = df.index.tz_localize('America/New_York')
print(df)
#                            bbb    ccc
# Date Time                            
# 2020-05-01 12:34:56-04:00    1   True
# 2020-05-01 16:34:56-04:00    4  False
この設定では日付型のインデックス(DatetimeIndex)であることが必要です。
<よく使うタイムゾーン>
'UTC' 'Europe/London' 'America/New_York' 'Asia/Tokyo'

日付型インデックスのタイムゾーンを変更

投資のシステムを構築する際にハマるのがタイムゾーンです。標準時、ロンドン時間、ニューヨーク時間、ニューヨーク時間、日本時間など変換する頻度が多いです。

df = pd.DataFrame([["2020/05/01 12:34:56",1,True],["2020/05/01 16:34:56",4,False]], columns = ["Date Time", "bbb", "ccc"]) # リスト型のデータで作成
df.index = pd.DatetimeIndex(pd.to_datetime(df['Date Time'], utc=True), name='Date Time')
del df['Date Time']

print(df)
#                            bbb    ccc
# Date Time                            
# 2020-05-01 12:34:56+00:00    1   True
# 2020-05-01 16:34:56+00:00    4  False

df = df.tz_convert('America/New_York')
print(df)
#                            bbb    ccc
# Date Time                            
# 2020-05-01 08:34:56-04:00    1   True
# 2020-05-01 12:34:56-04:00    4  False
この変換では日付型のインデックス(DatetimeIndex)であることが必要です。
データフレームでタイムゾーンを変更する際は、列を一旦インデックスにしてタイムゾーンを変換し、それを列データに代入するという方法もあります。
<よく使うタイムゾーン>
'UTC' 'Europe/London' 'America/New_York' 'Asia/Tokyo'

インデックスの位置を取得

df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"], index = ["aaa", "bbb"]) 

print(df)
#      aaa  bbb  ccc
# aaa    1    2    3
# bbb    4    5    6

print(df.index.get_loc('aaa'))
# 0

カラム

カラム名を取得

インデックスとカラム名をリスト型で取得します。

  • df.index:インデックス
  • df.columns:カラム名
df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"], index = ["age", "type"])

print(df)
#       aaa  bbb  ccc
# age     1    2    3
# type    4    5    6

# カラム名
print(df.columns)
# Index(['aaa', 'bbb', 'ccc'], dtype='object')

カラム名の一覧を取得

df.columnsでカラム名の一覧を取得できます。

df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"])

print(df)
#    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6

print(df.columns)
# Index(['aaa', 'bbb', 'ccc'], dtype='object')

if 'aaa' in df.columns:
    print("YES")
columnsです。columnではありません。sを忘れずに
*Pythonは、sの有無や、( )や[ ]の区分のパターンが整理されていないように思います。

カラム名を設定

既存のデータフレームの先頭行をカラム名に指定します。

df = pd.DataFrame([["aaa", "bbb", "ccc"], [1,2,3],[4,5,6]])

print(df)
#      0    1    2
# 0  aaa  bbb  ccc
# 1    1    2    3
# 2    4    5    6

df.columns = df.iloc[0]
df = df.drop(0)

print(df)
# 0 aaa bbb ccc
# 1   1   2   3
# 2   4   5   6
この場合、インデックの0がインデックス名となり0がなくなります。必要に応じてインデックスの再設定をしましょう。df = df.reset_index(drop=True)

カラム名を変更

df = pd.DataFrame([[1,2,3],[1,4,3],[2,4,1]], columns = ["aaa", "bbb", "ccc"])

print(df)

df = df.rename(columns={'aaa': 'After'}) # 列
print(df)
#    After  bbb  ccc
# 0      1    2    3
# 1      1    4    3
# 2      2    4    1
カラム名とインデックス名を同時に変更するには、以下でできます。
df = df.rename(columns={'A': 'a'}, index={'ONE': 'one'})

カラムの位置を取得

df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"], index = ["aaa", "bbb"])

print(df)
#      aaa  bbb  ccc
# aaa    1    2    3
# bbb    4    5    6

print(df.columns.get_loc('bbb'))
# 1

列と行の軸を入れ替える

df.Tとするだけで、軸の入れ替えができます。

置き換える場合は代入する必要があります。
df = df.T

df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"], index = ["age", "type"])
print(df)
#       aaa  bbb  ccc
# age     1    2    3
# type    4    5    6

print(df.T)
#      age  type
# aaa    1     4
# bbb    2     5
# ccc    3     6

 

タイトルとURLをコピーしました