インデックス(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 # 月
インデックス名の変更
個別
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