カテゴリー

当サイトはアフィリエイトプログラムによる収益を得ています〈景品表示法に基づく表記です)

pandas

【pd&MultiIndex】pandasで複数インデックスの設定と書き読み

2021年6月19日

こんな人にオススメ

pandasで行を表すインデックスを複数にするにはどうすればいいのだ?

MultiIndexとは聞いたことがあるが一体全体...

ということで、今回はpythonのpandasで複数インデックスを作成する方法を解説する。いわゆるMultiIndexというもの。イメージは以下。level0level1MultiIndexで、以下にはlevel0が一緒になっている場合を書いている。

hdr0 hdr1 hdr2 hdr3
level0 level1
ind_A 1 0 10 20 30
2 10 20 30 40
ind_B 3 20 30 40 50
4 30 40 50 60
ind_C 5 40 50 60 70
6 50 60 70 80

python環境は以下。

  • Python 3.9.4
  • numpy 1.20.3
  • pandas 1.2.4

運営者のメガネです。YouTubeTwitterInstagram、自己紹介はこちら、お問い合わせはこちらから。

運営者メガネ

下準備

まずは本記事で共通の処理。

モジュールのimport

import numpy as np
import pandas as pd

本記事で使用するモジュール、numpypandasimport

作成するデータの行数と列数

# 6行4列の配列を作成
rows, cols = 6, 4

本記事で作成するデータ部分(ヘッダやインデックスは含まない)は、6行4列にするため予め行数と列数を定義。

シンプルにデータフレームの作成

とりあえず、MultiIndexとか考えずにシンプルなデータフレームを作成。

データ部分の辞書を作成

dct = {}
for col in range(cols):
    # データは10ずつズラす
    arr = 10 * np.arange(col, col + rows)
    dct[f"hdr{col}"] = arr
print(dct)
# {'hdr0': array([ 0, 10, 20, 30, 40, 50]), 'hdr1': array([10, 20, 30, 40, 50, 60]), 'hdr2': array([20, 30, 40, 50, 60, 70]), 'hdr3': array([30, 40, 50, 60, 70, 80])}

即席でシンプルなデータフレームを作成するには辞書が簡単。辞書のkeysにデータフレームのヘッダーを、valuesにそれぞれのヘッダーに対応したデータを設定。今回は列が右に行くごとにデータを10ずつ増やすようにした。

データフレームを作成

# DataFrameを作成
df = pd.DataFrame(dct)
print(df)
#    hdr0  hdr1  hdr2  hdr3
# 0     0    10    20    30
# 1    10    20    30    40
# 2    20    30    40    50
# 3    30    40    50    60
# 4    40    50    60    70
# 5    50    60    70    80

辞書からデータフレームには単純にpd.DataFrameに入れたらいい。

インデックスの追加

ヘッダ名つきのデータフレームは上記で作成したので、ここではインデックスを追加してみる。

  1. 辞書の中にインデックスを入れる方法(上記の派生)
  2. データフレームを作成するときにインデックスを追加する方法(本章最後)

インデックス配列の作成

index = [f"index{n}" for n in range(rows)]
print(index)
# ['index0', 'index1', 'index2', 'index3', 'index4', 'index5']

インデックスは単純にindex0というようにした。これを最終的にはデータフレームのインデックスとする。

辞書にインデックスも含める

dct = {'index': index}
for col in range(cols):
    # データは10ずつズラす
    arr = 10 * np.arange(col, col + rows)
    dct[f"hdr{col}"] = arr
print(dct)
# {'index': ['index0', 'index1', 'index2', 'index3', 'index4', 'index5'], 'hdr0': array([ 0, 10, 20, 30, 40, 50]), 'hdr1': array([10, 20, 30, 40, 50, 60]), 'hdr2': array([20, 30, 40, 50, 60, 70]), 'hdr3': array([30, 40, 50, 60, 70, 80])}

先ほど同様、辞書からデータフレームを作成する場合は辞書中にインデックスも入れておくと一括管理が可能。

インデックスの作成

# シンプルにDataFrameにしてもインデックスは設定できない
df = pd.DataFrame(dct)
print(df)
#     index  hdr0  hdr1  hdr2  hdr3
# 0  index0     0    10    20    30
# 1  index1    10    20    30    40
# 2  index2    20    30    40    50
# 3  index3    30    40    50    60
# 4  index4    40    50    60    70
# 5  index5    50    60    70    80

シンプルにデータフレームにしてももちろんインデックスは認識してくれない。インデックスの指定は.set_index((インデックスにしたいヘッダ名))で可能。

# インデックスの列を明示する
df = df.set_index('index')
print(df)
#         hdr0  hdr1  hdr2  hdr3
# index
# index0     0    10    20    30
# index1    10    20    30    40
# index2    20    30    40    50
# index3    30    40    50    60
# index4    40    50    60    70
# index5    50    60    70    80

引数inplace=Trueにすると元のデータフレームが変更される。

# inplaceをTrueにすると元のDataFrameが変更される
df = pd.DataFrame(dct)
df.set_index('index', inplace=True)
print(df)
#         hdr0  hdr1  hdr2  hdr3
# index
# index0     0    10    20    30
# index1    10    20    30    40
# index2    20    30    40    50
# index3    30    40    50    60
# index4    40    50    60    70
# index5    50    60    70    80

インデックスの取り出し

# インデックスの値の取り出しは.index
index_val = df.index
print(index_val)
# Index(['index0', 'index1', 'index2', 'index3', 'index4', 'index5'], dtype='object', name='index')
print(type(index_val))
# <class 'pandas.core.indexes.base.Index'>
print(index_val.values)
# ['index0' 'index1' 'index2' 'index3' 'index4' 'index5']
print(type(index_val.values))
# <class 'numpy.ndarray'>

インデックスの取り出しは.indexで行う。データ部分の取り出しはdf[(ヘッダ名)]で行うので注意が必要。.indexのままだとpandasの形式になっているのでさらに.valuesで値だけ取り出す必要がある。

インデックスの取り出しでヘッダの時と同じように指定するとエラー。

# index引数では列名指定ができない
df = pd.DataFrame(dct, index='index')
#     raise cls._scalar_data_error(dct)
# TypeError: Index(...) must be called with a collection of some kind, 'index' was passed

データフレーム作成時にインデックスの追加

# index引数では直接インデックスの名前を入れる
dct = {}
for col in range(cols):
    arr = 10 * np.arange(col, col + rows)
    dct[f"hdr{col}"] = arr

df = pd.DataFrame(dct, index=['ind0', 'ind1', 'ind2', 'ind3', 'ind4', 'ind5'])
print(df)
#       hdr0  hdr1  hdr2  hdr3
# ind0     0    10    20    30
# ind1    10    20    30    40
# ind2    20    30    40    50
# ind3    30    40    50    60
# ind4    40    50    60    70
# ind5    50    60    70    80

これまでは予め辞書中にインデックスを入れてからデータフレームを作成したが、ここではデータフレームの作成時にインデックスを追加している。

これだとデータフレーム作成時のみインデックスを使用するので、79文字を超えないならこれもいいだろう。79文字制限については以下参照。ちなみに上のコードだとセーフ78文字。

【PEP8&flake8】pythonにおけるPEP8とflake8

続きを見る

辞書型からMultiIndexを作成

さて、本題のMultiIndex

  1. 単純にインデックスが複数個あるデータフレーム
  2. 浅い方のインデックス名にダブりがある場合

複数のインデックスを作成

# 複数のインデックスを作成
index_a = [f"index{n}" for n in range(rows)]
index_b = [f"index{10 * n}" for n in range(rows)]

dct = {'index_a': index_a, 'index_b': index_b}
for col in range(cols):
    arr = 10 * np.arange(col, col + rows)
    dct[f"hdr{col}"] = arr
print(dct)
# {'index_a': ['index0', 'index1', 'index2', 'index3', 'index4', 'index5'], 'index_b': ['index0', 'index10', 'index20', 'index30', 'index40', 'index50'], 'hdr0': array([ 0, 10, 20, 30, 40, 50]), 'hdr1': array([10, 20, 30, 40, 50, 60]), 'hdr2': array([20, 30, 40, 50, 60, 70]), 'hdr3': array([30, 40, 50, 60, 70, 80])}

今回も辞書から作成する。辞書中にインデックスabを入れた。これを単純にデータフレームに変換し、その後インデックスを2つ指定することで複数個のインデックスを作成することが可能。

df = pd.DataFrame(dct)
# .set_indexでは複数列を選択可能
df.set_index(['index_a', 'index_b'], inplace=True)
print(df)
#                  hdr0  hdr1  hdr2  hdr3
# index_a index_b
# index0  index0      0    10    20    30
# index1  index10    10    20    30    40
# index2  index20    20    30    40    50
# index3  index30    30    40    50    60
# index4  index40    40    50    60    70
# index5  index50    50    60    70    80

インデックスを取り出すと型はMultiIndexで2次元配列のイメージ。

index_val = df.index
print(index_val)
# MultiIndex([('index0',  'index0'),
#             ('index1', 'index10'),
#             ('index2', 'index20'),
#             ('index3', 'index30'),
#             ('index4', 'index40'),
#             ('index5', 'index50')],
#            names=['index_a', 'index_b'])
# "操作は後ほど詳しく説明"

print(type(index_val))
# <class 'pandas.core.indexes.multi.MultiIndex'>

print(index_val.values)
# [('index0', 'index0') ('index1', 'index10') ('index2', 'index20')
#  ('index3', 'index30') ('index4', 'index40') ('index5', 'index50')]

print(type(index_val.values))
# <class 'numpy.ndarray'>

同じ名称のインデックスは省略表示

# level0で連続した文字を指定すると、かぶっている文字は省略される
index_a = [f"index{n // 2}" for n in range(rows)]
index_b = [f"index{10 * n}" for n in range(rows)]
print(index_a)
# ['index0', 'index0', 'index1', 'index1', 'index2', 'index2']
print(index_b)
# ['index0', 'index10', 'index20', 'index30', 'index40', 'index50']

dct = {'index_a': index_a, 'index_b': index_b}
for col in range(cols):
    arr = 10 * np.arange(col, col + rows)
    dct[f"hdr{col}"] = arr
print(dct)
# # {'index_a': ['index0', 'index0', 'index1', 'index1', 'index2', 'index2'], 'index_b': ['index0', 'index10', 'index20', 'index30', 'index40', 'index50'], 'hdr0': array([ 0, 10, 20, 30, 40, 50]), 'hdr1': array([10, 20, 30, 40, 50, 60]), 'hdr2': array([20, 30, 40, 50, 60, 70]), 'hdr3': array([30, 40, 50, 60, 70, 80])}

今度は浅い方のインデックス(index_a)の名称をダブらせてみる。すると、ダブっているインデックスは省略されて表示される。もちろん削除されたわけではなく、表示上の省略なので取り出しも可能。

df = pd.DataFrame(dct)
# .set_indexでは複数列を選択可能
df.set_index(['index_a', 'index_b'], inplace=True)
print(df)
#                  hdr0  hdr1  hdr2  hdr3
# index_a index_b
# index0  index0      0    10    20    30
#         	index10    10    20    30    40
# index1  index20    20    30    40    50
#         	index30    30    40    50    60
# index2  index40    40    50    60    70
#         	index50    50    60    70    80

print(df.index)
# MultiIndex([('index0',  'index0'),
#             ('index0', 'index10'),
#             ('index1', 'index20'),
#             ('index1', 'index30'),
#             ('index2', 'index40'),
#             ('index2', 'index50')],
#            names=['index_a', 'index_b'])

データフレーム作成時にMultiIndexを作成

 

データフレーム作成時にもMultiIndexの設定は可能。以下では以下のように3つのパーツに分けてMuliIndexのデータフレームを作成する。

  • インデックス
  • データ
  • ヘッダー

必要なデータの作成

# level0がより左側のインデックスで、階層は上のインデックス
level0 = ['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C']
level1 = [1, 2, 3, 4, 5, 6]
indices = [level0, level1]
print(indices)
# [['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C'], [1, 2, 3, 4, 5, 6]]

まずは必要なデータを作成。インデックスは上のように設定。

  • 浅いレベル(より左)のインデックス: ind_A, ind_B, ind_Cで2つずつダブらせ
  • 深いレベル(より右)のインデックス: 1, 2, 3, 4, 5, 6

データ部分は上記同様10ずつズラしながら作成。しかし、作成のままだと行と列が逆転しているので.Tで転置。

# データ自体を作成
data = []
for col in range(cols):
    # データは10ずつズラす
    arr = 10 * np.arange(col, col + rows)
    data.append(arr)
data = np.array(data)
# このままだと行と列の数が合わない
print(data)
# [[ 0 10 20 30 40 50]
#  [10 20 30 40 50 60]
#  [20 30 40 50 60 70]
#  [30 40 50 60 70 80]]

# 行と列を入れ替え
data = data.T
print(data)
# [[ 0 10 20 30]
#  [10 20 30 40]
#  [20 30 40 50]
#  [30 40 50 60]
#  [40 50 60 70]
#  [50 60 70 80]]

ヘッダーはシンプルに配列を作成。

# ヘッダーを作成
column = ['hdr0', 'hdr1', 'hdr2', 'hdr3']
print(column)
# ['hdr0', 'hdr1', 'hdr2', 'hdr3']

MuliIndex対応データフレームの作成

データフレームの作成時に、データとインデックスとヘッダーを指定するとそれに応じて自動で作成してくれる。

df = pd.DataFrame(data, index=indices, columns=column)
print(df)
#          hdr0  hdr1  hdr2  hdr3
# ind_A 1     0    10    20    30
#       	2    10    20    30    40
# ind_B 3    20    30    40    50
#       	4    30    40    50    60
# ind_C 5    40    50    60    70
#       	6    50    60    70    80

なお、インデックスの並び方を逆にすると、MultiIndexの表示省略はなくなる。

# インデックスの配列を逆転させるとMultiIndexの表示省略がなくなる
print(indices[::-1])
# [[1, 2, 3, 4, 5, 6], ['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C']]

df = pd.DataFrame(data, index=indices[::-1], columns=column)
print(df)
#          hdr0  hdr1  hdr2  hdr3
# 1 ind_A     0    10    20    30
# 2 ind_A    10    20    30    40
# 3 ind_B    20    30    40    50
# 4 ind_B    30    40    50    60
# 5 ind_C    40    50    60    70
# 6 ind_C    50    60    70    80

MultiIndexで遊ぶ

MultiIndexを作成したので遊ぶ。

インデックスの取り出し

# インデックス全体の値の取得は.index
index_val = df.index
print(index_val)
# MultiIndex([('ind_A', 1),
#             ('ind_A', 2),
#             ('ind_B', 3),
#             ('ind_B', 4),
#             ('ind_C', 5),
#             ('ind_C', 6)],
#            )
print(type(index_val))
# <class 'pandas.core.indexes.multi.MultiIndex'>

インデックス全体の取り出しは.indexで可能。さらにレベルごとのインデックスの取り出しも可能、レベルはインデックスの左側が「朝く」インデックスの右側が「深い」。今でいえばind_Aは浅く、1, 2は深い。

レベルが一番浅いインデックスは0として取り出すことが可能で、深くなるにつれて1, 2となる。

# レベルごとに値を取り出し可能
level0_ind = index_val.get_level_values(0)
level1_ind = index_val.get_level_values(1)

print(level0_ind)
# Index(['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C'], dtype='object')

print(type(level0_ind))
# <class 'pandas.core.indexes.base.Index'>

print(level1_ind)
# Int64Index([1, 2, 3, 4, 5, 6], dtype='int64')

print(type(level1_ind))
# <class 'pandas.core.indexes.numeric.Int64Index'>

# listに変換可能
print(list(level0_ind))
# ['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C']
print(list(level1_ind))
# [1, 2, 3, 4, 5, 6]

インデックスに名前をつける

# インデックスに名前をつける
df.index.names = ['level0', 'level1']
print(df)
#                hdr0  hdr1  hdr2  hdr3
# level0 level1
# ind_A  1          0    10    20    30
#        	2         10    20    30    40
# ind_B  3         20    30    40    50
#        	4         30    40    50    60
# ind_C  5         40    50    60    70
#        	6         50    60    70    80

インデックスが複数になるとその管理も大変になる。そこでインデックスに名前をつけることで管理がしやすくなる。名前付けは.index.namesで可能。また、インデックスの数と名前の数が一致していないとエラー。

# インデックスの数と名前の数は合わせる必要あり
df.index.names = ['level0']
#     raise ValueError(
# ValueError: Length of names must match number of levels in MultiIndex.

もし名前をつけたくないのなら、空白文字を入れたら大丈夫。

# 名前をつけたくなければ空白にすればいい
df.index.names = ['level0', '']
print(df)
#           hdr0  hdr1  hdr2  hdr3
# level0 1
# ind_A  1     0    10    20    30
#        	2    10    20    30    40
# ind_B  3    20    30    40    50
#        	4    30    40    50    60
# ind_C  5    40    50    60    70
#        	6    50    60    70    80

インデックスを名前で呼び出し

# インデックスに名前をつけたので、インデックス名での指定も可能に
level0_ind_index = index_val.get_level_values(0)
print(level0_ind_index)
# Index(['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C'], dtype='object', name='level0')

level0_ind_name = index_val.get_level_values('level0')
print(level0_ind_name)
# Index(['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C'], dtype='object', name='level0')

インデックスに名前をつけたのでインデックス自体をな目を呼び出すことが可能に。もちろん、存在しないインデックスを指定するとエラー。

# 存在しないインデックスを指定するとエラー
level2_ind_name = index_val.get_level_values('level2')
#     raise KeyError(f"Level {level} not found") from err
# KeyError: 'Level level2 not found'

また、インデックスの取り出しは.index.get_level_valuesで行うのが無難。ヘッダーのように取り出すとエラー。

# ヘッダー(もしくは列)と同じように取り出しはできない
print(df.index.level0)
#     print(df.index.level0)
# AttributeError: 'MultiIndex' object has no attribute 'level0'

print(df.index['level0'])
# IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

特定の条件に当てはまるインデックスのデータフレームを抽出

# 元のデータフレーム
print(df)
#                hdr0  hdr1  hdr2  hdr3
# level0 level1
# ind_A  1          0    10    20    30
#        	2         10    20    30    40
# ind_B  3         20    30    40    50
#        	4         30    40    50    60
# ind_C  5         40    50    60    70
#        	6         50    60    70    80

# インデックスがind_Aであるかどうかをlevel1内でTrue or False
conditoin = level0_ind_name == 'ind_A'
print(conditoin)
# [ True  True False False False False]

df_ind_A = df[conditoin]
print(df_ind_A)
#           hdr0  hdr1  hdr2  hdr3
# level0
# ind_A  1     0    10    20    30
#        	2    10    20    30    40

特定の条件に当てはまるインデックスのデータフレームを抽出するにはTrue, Falseの判定をさせればいい。上の例ではインデックスがind_Aであるデータフレームを抽出している。

また、条件は複数個指定可能でその時は条件ごとにカッコでくくりビット演算子(or: |and: &など)を使用。

conditoin = (level0_ind_name == 'ind_A') | (level0_ind_name == 'ind_C')
print(conditoin)
# [ True  True False False  True  True]
df_ind_AC = df[conditoin]
print(df_ind_AC)
#           hdr0  hdr1  hdr2  hdr3
# level0
# ind_A  1     0    10    20    30
#        	2    10    20    30    40
# ind_C  5    40    50    60    70
#        	6    50    60    70    80

条件同士をカッコでくくらなかったり、ビット演算子を使用しない場合はエラー(ビット演算子を使用しない時はanyとかを使用する必要あり)。

# 条件同士をカッコで区別しないとエラー
conditoin = level0_ind_name == 'ind_A' | level0_ind_name == 'ind_C'
#     conditoin = level0_ind_name == 'ind_A' | level0_ind_name == 'ind_C'
# TypeError: unsupported operand type(s) for |: 'str' and 'Index'

# ビット演算子を使用しない場合はanyとかallを駆使しないといけない
conditoin = (level0_ind_name == 'ind_A') or (level0_ind_name == 'ind_C')
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

level1に対しても条件を指定することが可能。以下ではlevel1が偶数のデータフレームだけを抽出。

# level1が偶数のデータフレームだけ抽出
level1_ind_name = index_val.get_level_values('level1')
conditoin = level1_ind_name % 2 == 0
print(conditoin)
# [False  True False  True False  True]

df_ind_2 = df[conditoin]
print(df_ind_2)
#                hdr0  hdr1  hdr2  hdr3
# level0 level1
# ind_A  2         10    20    30    40
# ind_B  4         30    40    50    60
# ind_C  6         50    60    70    80

MultiIndexデータフレームをtxtファイルに書き出し、読み込み

最後に作成したMultiIndexデータフレームをtxtファイルに書き出す。そして書き出したデータフレームを読み込む。

データの書き出し

level0 = ['ind_A', 'ind_A', 'ind_B', 'ind_B', 'ind_C', 'ind_C']
level1 = [1, 2, 3, 4, 5, 6]
indices = [level0, level1]

data = []
for col in range(cols):
    # データは10ずつズラす
    arr = 10 * np.arange(col, col + rows)
    data.append(arr)
data = np.array(data)
data = data.T

column = ['hdr0', 'hdr1', 'hdr2', 'hdr3']
df = pd.DataFrame(data, index=indices, columns=column)
df.index.names = ['level0', 'level1']

# print(df)
# #                hdr0  hdr1  hdr2  hdr3
# # level0 level1
# # ind_A  1          0    10    20    30
# #        	2         10    20    30    40
# # ind_B  3         20    30    40    50
# #        	4         30    40    50    60
# # ind_C  5         40    50    60    70
# #        	6         50    60    70    80

# 出力するとシンプルに全データがヘッダに行く
df.to_csv('multiindex.txt', sep='\\t')
# level0	level1	hdr0	hdr1	hdr2	hdr3
# ind_A	1	0	10	20	30
# ind_A	2	10	20	30	40
# ind_B	3	20	30	40	50
# ind_B	4	30	40	50	60
# ind_C	5	40	50	60	70
# ind_C	6	50	60	70	80

データの書き出しは.to_csvで行う。今回はtxtファイルにしたので区切り文字はsep='\t'でタブを指定。csvファイルにする際にはsep=','にする(デフォルトが','であるが執筆者は明示している)。インデックスは1行下げて区別したかったがどうにもできない感じだった。

データの読み込み

# シンプルにデータを読み込むとインデックスの設定ができない
df_read = pd.read_csv('./multiindex.txt', sep='\\t')
print(df_read)
#   level0  level1  hdr0  hdr1  hdr2  hdr3
# 0  ind_A       1     0    10    20    30
# 1  ind_A       2    10    20    30    40
# 2  ind_B       3    20    30    40    50
# 3  ind_B       4    30    40    50    60
# 4  ind_C       5    40    50    60    70
# 5  ind_C       6    50    60    70    80

データの読み込みはpd.read_csvで行う。こちらも区切り文字はsep='\t'にする。ただし、インデックスが全てヘッダーにいってしまっているので、index_colでインデックスにしたい列番号を指定する必要がある。

# インデックスの列番号を指定
df_read = pd.read_csv('./multiindex.txt', sep='\\t', index_col=[0, 1])
print(df_read)
#                hdr0  hdr1  hdr2  hdr3
# level0 level1
# ind_A  1          0    10    20    30
#        	2         10    20    30    40
# ind_B  3         20    30    40    50
#        	4         30    40    50    60
# ind_C  5         40    50    60    70
#        	6         50    60    70    80

もしくは直接インデックスの名前をindex_colに入れる。インデックスとを1つにしたいの場合はstrでもいいが、2つ以上ある場合はlistなどで指定する必要がある。

# インデックスの列名を指定
index_col = ('level0', 'level1')
df_read = pd.read_csv('./multiindex.txt', sep='\\t', index_col=index_col)
print(df_read)
#                hdr0  hdr1  hdr2  hdr3
# level0 level1
# ind_A  1          0    10    20    30
#       	 2         10    20    30    40
# ind_B  3         20    30    40    50
#        	4         30    40    50    60
# ind_C  5         40    50    60    70
#        	6         50    60    70    80

# インデックスを1つにする場合はstrでも可能
index_col = 'level0'
df_read = pd.read_csv('./multiindex.txt', sep='\\t', index_col=index_col)
print(df_read)
#         level1  hdr0  hdr1  hdr2  hdr3
# level0
# ind_A        1     0    10    20    30
# ind_A        2    10    20    30    40
# ind_B        3    20    30    40    50
# ind_B        4    30    40    50    60
# ind_C        5    40    50    60    70
# ind_C        6    50    60    70    80

データ整理のレベルが上がる

今回はpandasMultiIndexについて解説した。MultiIndexを使用するとインデックスが

  • before: A_1, A_2, A_3, ..., B_1, ...
  • after: A, B, ...と1, 2, ...

のように分類しやすくなる。もちろん使いすぎると列を圧迫して見にくくはなるが、知っているとデータ整理のレベルが上がると思う。

実はMultiColumnsMultiHeaderとかも言われるけど名前はまちまち)もあり、こっちはヘッダが階層構造になっている。これについては関連記事参照。個人的にはColumnsの方がよく使う印象なので、是非とも見ていただきたい。

関連記事

【pd&MultiColumns】pandasで複数ヘッダーの設定と書き読み

続きを見る

多項式関数のグラフ
【辞書&pandas】dict{name: , val: {a: [~], b:[~]}}のpandas化

続きを見る

【辞書の結合】dictのマージ

続きを見る

【plotly&pandas】df.plot()でPlotlyのグラフを作成

続きを見る

ガジェット

2023/9/18

【デスクツアー2022下半期】モノは少なく、でも効率的に Desk Updating #0

今回はガジェットブロガーなのにデスク環境を構築していない執筆者の ...

ライフハック

2023/9/16

【Audible vs YouTube Premium】耳で聴く音声学習コンテンツを比較

ワイヤレスイヤホンが普及し耳で学習することへのハードルが格段に下 ...

完全ワイヤレスイヤホン(TWS)

2023/9/18

【SENNHEISER MOMENTUM True Wireless 3レビュー】全てが整ったイヤホン

今回は高音質・高機能なSENNHEISERのフラグシップ完全ワイヤレスイヤホン「SENNH ...

ライフハック

2023/3/11

【YouTube Premiumとは】メリットしかないから全員入れ

今回はYouTube Premiumを実際に使ってみてどうなのか、どんなメリット/デメリット ...

マウス

2023/8/17

【Logicool MX ERGOレビュー】疲れない作業効率重視トラックボールマウス

こんな人におすすめ トラックボールマウスの王道Logicool MX ERGOが気になるけどऩ ...

ベストバイ

2023/9/18

【ベストバイ2022】今年買って良かったモノのトップ10

2022年ベストバイ この1年を振り返って執筆者は何を買ったのか。ガジェッ& ...

スマホ

2023/1/15

【楽天モバイル×povo2.0の併用】月1,000円の保険付きデュアルSIM運用

こんな人におすすめ 楽天モバイルとpovo2.0のデュアルSIM運用って実際のとこ ...

マウス

2023/9/16

【Logicool MX ERGO vs MX Master 3】ERGOをメインにした決定的な理由

こんな疑問・お悩みを持っている人におすすめ 執筆者はLogicoolのハイエンӠ ...

macOSアプリケーション

2022/9/30

【Chrome拡張機能】便利で効率的に作業できるおすすめの拡張機能を18個紹介する

こんな人におすすめ Chromeの拡張機能を入れたいけど、調べても同じような ...

macOSアプリケーション

2023/5/3

【Automator活用術】Macで生産性を上げる作業の自動化術

今回はMacに標準でインストールされているアプリ「Automator」を使ってできる ...

Pythonを学びたいけど独学できる時間なんてない人へのすゝめ

執筆者は大学の研究室・大学院にて独学でPythonを習得した。

でも社会人になったら独学で行うには時間も体力もなくて大変だ。

時間がない社会人だからこそプロの教えを乞うのが効率的。

ここでは色んなタイプに合ったプログラミングスクールの紹介をする。

  • この記事を書いた人

メガネ

Webエンジニア駆け出し。独学のPythonで天文学系の大学院を修了。常時金欠のガジェット好きでM2 Pro MacBook Pro(30万円) x Galaxy S22 Ultra(17万円)使いの狂人。自己紹介と半生→変わって楽しいの繰り返しレビュー依頼など→お問い合わせ運営者情報、TwitterX@m_ten_pa、 YouTube@megatenpa、 Threads@megatenpa

-pandas
-, ,