環境
- 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')],
)