インデックス(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
