pandasで複数行の列を持つDataFrameを作成する方法
<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からの画像