こんな人にオススメ
pandas
で行を表すインデックスを複数にするにはどうすればいいのだ?
MultiIndex
とは聞いたことがあるが一体全体...
ということで、今回はpythonのpandas
で複数インデックスを作成する方法を解説する。いわゆるMultiIndex
というもの。イメージは以下。level0
とlevel1
がMultiIndex
で、以下には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
下準備
まずは本記事で共通の処理。
モジュールのimport
import numpy as np import pandas as pd
本記事で使用するモジュール、numpy
とpandas
のimport
。
作成するデータの行数と列数
# 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
に入れたらいい。
インデックスの追加
ヘッダ名つきのデータフレームは上記で作成したので、ここではインデックスを追加してみる。
- 辞書の中にインデックスを入れる方法(上記の派生)
- データフレームを作成するときにインデックスを追加する方法(本章最後)
インデックス配列の作成
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
。
- 単純にインデックスが複数個あるデータフレーム
- 浅い方のインデックス名にダブりがある場合
複数のインデックスを作成
# 複数のインデックスを作成 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])}
今回も辞書から作成する。辞書中にインデックスa
とb
を入れた。これを単純にデータフレームに変換し、その後インデックスを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
データ整理のレベルが上がる
今回はpandas
のMultiIndex
について解説した。MultiIndex
を使用するとインデックスが
- before:
A_1
,A_2
,A_3
, ...,B_1
, ... - after:
A
,B
, ...と1
,2
, ...
のように分類しやすくなる。もちろん使いすぎると列を圧迫して見にくくはなるが、知っているとデータ整理のレベルが上がると思う。
実はMultiColumns
(MultiHeader
とかも言われるけど名前はまちまち)もあり、こっちはヘッダが階層構造になっている。これについては関連記事参照。個人的にはColumns
の方がよく使う印象なので、是非とも見ていただきたい。
関連記事
-
-
【pd&MultiColumns】pandasで複数ヘッダーの設定と書き読み
続きを見る
-
-
【辞書&pandas】dict{name: , val: {a: [~], b:[~]}}のpandas化
続きを見る
-
-
【辞書の結合】dictのマージ
続きを見る
-
-
【plotly&pandas】df.plot()でPlotlyのグラフを作成
続きを見る