Как можно объединить несколько столбцов pandas данных в имя родительского столбца? - PullRequest
1 голос
/ 15 апреля 2020

У меня есть фрейм данных, похожий на этот

        some feature  another feature  label
sample
0       ...           ...              ...

, и я хотел бы получить фрейм данных с мультииндексированными столбцами, такими как

        features            label
sample  some       another
0       ...        ...      ...

Из API мне не понятно, как правильно использовать from_arrays(), from_product(), from_tuples() или from_frame(). Решение не должно зависеть от разбора строк столбцов объектов (some feature, another feature). Последний столбец для метки - это последний столбец, и можно использовать его имя label. Как я могу получить хочу, я хочу?

1 Ответ

1 голос
/ 15 апреля 2020

Из 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
...