Из API мне не понятно, как правильно использовать from_arrays()
, from_product()
, from_tuples()
или from_frame()
.
В основном используется, если генерировать новый DataFrame с MultiIndex независимо от имен исходных столбцов.
Таким образом, это означает, что при необходимости совершенно новый MultiIndex
, например, списками или массивами:
a = ['a','a','b']
b = ['x','y','z']
df.columns = pd.MultiIndex.from_arrays([a,b])
print (df)
a b
x y z
sample
0 2 3 5
1 4 5 7
РЕДАКТИРОВАТЬ1: Если хотите, установите для всех столбцов значение MultiIndex
для всех столбцов одинаково без последнего:
a = ['parent'] * (len(df.columns) - 1) + ['label']
b = df.columns[:-1].tolist() + ['val']
df.columns = pd.MultiIndex.from_arrays([a,b])
print (df)
parent label
feature a feature b val
sample
0 2 3 5
1 4 5 7
Это возможно с помощью split
, но если некоторые столбцы без разделителя получают NaN
s для второго уровня, поскольку невозможны комбинации столбцов MultiIndex и MultiIndex (в действительности да, но получают кортежи из столбцов MultiIndex):
print (df)
feature_a feature_b label
sample
0 2 3 5
1 4 5 7
df.columns = df.columns.str.split(expand=True)
print (df)
feature label
a b NaN
sample
0 2 3 5
1 4 5 7
Так что лучше конвертировать все столбцы без разделителя на Index/MultiIndex
сначала на DataFrame.set_index
:
df = df.set_index('label')
df.columns = df.columns.str.split(expand=True)
print (df)
feature
a b
label
5 2 3
7 4 5
Для предотвращения использования исходного индекса используется append=True
параметр:
df = df.set_index('label', append=True)
df.columns = df.columns.str.split(expand=True)
print (df)
feature
a b
sample label
0 5 2 3
1 7 4 5