どこにでもいる30代SEの学習ブログ

主にプログラミング関連の学習内容。読んだ本の感想や株式投資についても書いてます。

pandasで複数行の列を持つDataFrameを作成する方法

f:id:predora005:20200921203155j:plain
<pandasで複数行の列を持つDataFrameを作成する方法>*1

※ 2020/04/04にQrunchで書いた記事を移行しました。

列が複数行となっているDataFrameを作成する方法の覚書です。 結論は「pd.MultiIndexを使う」です。

例えば、次のようなDataFrameを作成したいとします。

#     One   Two Three
#    Four  Five   Six
# 0  1.11  2.22  3.33
# 1  4.44  5.55  6.66
# 2  7.77  8.88  9.99

MultiIndexは行にも列にも使えますが、今回は列を作るために利用しました。

MultiIndexの種類

作成の仕方は以下の4種類です。 元となるデータに応じて種類が変わります。

  • MultiIndex.from_arrays()
  • MultiIndex.from_tuples()
  • MultiIndex.from_product()
  • MultiIndex.from_frame()

MultiIndex.from_arrays()

名前の通り、array(list)から作成します。 4種類の中で一番オーソドックスな方法です。

data = [ [1.11,2.22,3.33], [4.44,5.55,6.66], [7.77,8.88,9.99] ]
arrays = [ ['One','Two','Three'], ['Four','Five','Six'] ]
columns = pd.MultiIndex.from_arrays(arrays)
df = pd.DataFrame(data=data, columns=columns)
#     One   Two Three
#    Four  Five   Six
# 0  1.11  2.22  3.33
# 1  4.44  5.55  6.66
# 2  7.77  8.88  9.99

MultiIndex.from_tuples()

名前の通り、tupleから作成します。 from_arrays()とは異なり、同一tupleの要素は異なる行に配置されます。

data = [ [1.11,2.22,3.33], [4.44,5.55,6.66], [7.77,8.88,9.99] ]
tuples = [ ('One', 'Four'), ('Two', 'Five'), ('Three','Six') ]
columns = pd.MultiIndex.from_tuples(tuples)
df = pd.DataFrame(data=data, columns=columns)
#     One   Two Three
#    Four  Five   Six
# 0  1.11  2.22  3.33
# 1  4.44  5.55  6.66
# 2  7.77  8.88  9.99

MultiIndex.from_product()

from_product()は要素の全組み合わせがほしいときに使います。 array(list)に限らず、iterableな要素が指定できます。

data = [ [1.11,2.22,3.33,4.44], [5.55,6.66,7.77,8.88] ]
arrays = [ ['One','Two'], ['Three','Four'] ]
columns = pd.MultiIndex.from_product(arrays)
df = pd.DataFrame(data=data, columns=columns)
#     One         Two      
#   Three  Four Three  Four
# 0  1.11  2.22  3.33  4.44
# 1  5.55  6.66  7.77  8.88

MultiIndex.from_frame()

今回の主旨にはそぐわないですが、DataFrameからMultiIndexを作成します。

data = [ [1.11,2.22,3.33], [4.44,5.55,6.66], [7.77,8.88,9.99] ]
arrays = [ ['One','Two','Three'], ['Four','Five','Six'] ]
columns = pd.MultiIndex.from_arrays(arrays)
df = pd.DataFrame(data=data, columns=columns)
#     One   Two Three
#    Four  Five   Six
# 0  1.11  2.22  3.33
# 1  4.44  5.55  6.66
# 2  7.77  8.88  9.99

index = pd.MultiIndex.from_frame(df)
# MultiIndex([(1.11, 2.22, 3.33),
#             (4.44, 5.55, 6.66),
#             (7.77, 8.88, 9.99)],
#            names=[('One', 'Four'), ('Two', 'Five'), ('Three', 'Six')])

自動でMultiIndexになる場合

DataFrameを作成する元になるデータがndarray、かつ、列がarray(list)の場合には、MultiIndexを明示的に使用せずとも自動でMultiIndex変換してくれます。

data = [ [1.11,2.22,3.33], [4.44,5.55,6.66], [7.77,8.88,9.99] ]
data = np.array(data)
arrays = [ ['One','Two','Three'], ['Four','Five','Six'] ]
df = pd.DataFrame(data=data, columns=arrays)
#     One   Two Three
#    Four  Five   Six
# 0  1.11  2.22  3.33
# 1  4.44  5.55  6.66
# 2  7.77  8.88  9.99

tupleは自動で変換してくれず、tupleがそのまま列になります。

data = [ [1.11,2.22,3.33], [4.44,5.55,6.66], [7.77,8.88,9.99] ]
data = np.array(data)
tuples = [ ('One', 'Four'), ('Two', 'Five'), ('Three','Six') ]
df = pd.DataFrame(data=data, columns=tuples)
#    (One, Four)  (Two, Five)  (Three, Six)
# 0         1.11         2.22          3.33
# 1         4.44         5.55          6.66
# 2         7.77         8.88          9.99

参考資料

MultiIndex / advanced indexing — pandas 1.0.3 documentation

*1:Mihai SurduによるPixabayからの画像