環境
- Python 3.11.2
- pandas 2.0.2
起きたこと
pandas.DataFrameにkeyがtupleであるdictを渡すと、MultiIndexな列を持つDataFrameを生成できます。
In [94]: data = {("japan","male"):[1,2,3], ("japan","female"):[11,12,13], ("u.s.","male"):[2,3,4]}
In [94]: data
Out[95]:
{('japan', 'male'): [1, 2, 3],
('japan', 'female'): [11, 12, 13],
('u.s.', 'male'): [2, 3, 4]}
In [96]: df1 = pandas.DataFrame(data)
In [97]: df1
Out[97]:
japan u.s.
male female male
0 1 11 2
1 2 12 3
2 3 13 4
In [98]: df1.columns
Out[98]:
MultiIndex([('japan', 'male'),
('japan', 'female'),
( 'u.s.', 'male')],
)
生成されたDataFrameの列を絞り込むため、columns引数に列名を指定します。
以下はcolumns引数の説明です。
Column labels to use for resulting frame when data does not have them, defaulting to RangeIndex(0, 1, 2, …, n). If data contains column labels, will perform column selection instead. 1
columns引数にtupleのlistを渡したら、生成されたDataFrameの列はMultiIndexではなく通常のIndexになってしまいました。
In [102]: df2 = pandas.DataFrame(data, columns=[("japan","female"), ("u.s.","male")])
In [103]: df2
Out[103]:
(japan, female) (u.s., male)
0 11 2
1 12 3
2 13 4
In [104]: df2.columns
Out[104]: Index([('japan', 'female'), ('u.s.', 'male')], dtype='object')
解決
MultiIndexの列を生成するには、columns引数にMultiIndexを渡す必要がありました。
In [107]: target_columns = pandas.MultiIndex.from_tuples([("japan","female"), ("u.s.","male")])
In [108]: target_columns
Out[108]:
MultiIndex([('japan', 'female'),
( 'u.s.', 'male')],
)
In [109]: df3 = pandas.DataFrame(data, columns=target_columns)
In [110]: df3
Out[110]:
japan u.s.
female male
0 11 2
1 12 3
2 13 4
In [111]: df3.columns
Out[111]:
MultiIndex([('japan', 'female'),
( 'u.s.', 'male')],
)