Как удалить все индайсы после распаковки фрейма данных

Мне пришлось распаковать огромный фрейм данных:

Transformation 1

После:

df_fact_eng.unstack()

результат выглядит так и является правильным:

Transformation 2

Что я хочу сделать сейчас, так это удалить мои столбцы индекса, явившись явным и используя:

df_fact_eng.reset_index(level=['Style', 'Katalog_ID', 'Produkt_ID'])

Cleaning 1

На данный момент у меня есть 2 проблемы, которые я не могу исправить:

  1. Как удалить "Eigenschaftstyp_Name" в качестве имени столбца?
  2. Как визуально вывести все «заголовки столбцов» в одну строку? Я хотел бы получить тот же результат, что и при первоначальной загрузке таблицы с помощью pd.read_xxx. Может быть, эта проблема решится после решения вопроса 1?

Можно ли показать df_fact_eng.head().to_dict()?

jezrael 11.04.2018 12:27
1
1
677
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что сначала нужно выбрать столбец Wert в unstack, если только один столбец, для удаления индекса используйте reset_index с drop=True и удалите имя столбца Eigenschaftstyp_Name добавьте rename_axis:

df_fact_eng = pd.DataFrame({'Eigenschaftstyp_Name':list('abcdef'),
                   'Katalog_ID':[4] * 6,
                   'Produkt_ID':[7] * 6,
                   'Style':[1] * 3 + [7] * 3,
                   'Wert':[5,3,6,9,2,4]})
df_fact_eng =df_fact_eng.set_index(['Katalog_ID','Produkt_ID','Style','Eigenschaftstyp_Name'])
print (df_fact_eng)
                                                  Wert
Katalog_ID Produkt_ID Style Eigenschaftstyp_Name      
4          7          1     a                        5
                            b                        3
                            c                        6
                      7     d                        9
                            e                        2
                            f                        4

df = (df_fact_eng['Wert'].unstack()
                         .reset_index(level=['Style', 'Katalog_ID', 'Produkt_ID'])
                         .reset_index(drop=True)
                         .rename_axis(None, axis=1))

print (df)
   Katalog_ID  Produkt_ID  Style    a    b    c    d    e    f
0           4           7      1  5.0  3.0  6.0  NaN  NaN  NaN
1           4           7      7  NaN  NaN  NaN  9.0  2.0  4.0

Если несколько столбцов в исходном DataFrame необходимо:

df_fact_eng = pd.DataFrame({'Eigenschaftstyp_Name':list('abcdef'),
                   'Katalog_ID':[4] * 6,
                   'Produkt_ID':[7] * 6,
                   'Style':[1] * 3 + [7] * 3,
                   'Wert':[5,3,6,9,2,4],
                   'Col':[7,8,1,4,5,1]})
df_fact_eng=df_fact_eng.set_index(['Katalog_ID','Produkt_ID','Style','Eigenschaftstyp_Name'])
print (df_fact_eng)
                                                  Col  Wert
Katalog_ID Produkt_ID Style Eigenschaftstyp_Name           
4          7          1     a                       7     5
                            b                       8     3
                            c                       1     6
                      7     d                       4     9
                            e                       5     2
                            f                       1     4

df = df_fact_eng.unstack()
#flatten MultiIndex to single columns
df.columns = df.columns.map('_'.join)
df = df.reset_index(level=['Style', 'Katalog_ID', 'Produkt_ID']).reset_index(drop=True)

print (df)
   Katalog_ID  Produkt_ID  Style  Col_a  Col_b  Col_c  Col_d  Col_e  Col_f  \
0           4           7      1    7.0    8.0    1.0    NaN    NaN    NaN   
1           4           7      7    NaN    NaN    NaN    4.0    5.0    1.0   

   Wert_a  Wert_b  Wert_c  Wert_d  Wert_e  Wert_f  
0     5.0     3.0     6.0     NaN     NaN     NaN  
1     NaN     NaN     NaN     9.0     2.0     4.0  

Большое спасибо. Пока помогает, но пока не понимаю. Похоже, что будет разница, если я вызову 'df.unstack ()' vs 'df [' Wert ']. Unstack ()'. Визуально это выглядит так же, но при использовании unstack без заданного имени столбца для значения само имя столбца остается поверх визуализации. Что это означает или: Когда мне нужно такое поведение?

Christian 11.04.2018 14:25

@Chris - разница в столбцах, проверьте df.unstack().columns vs df['Wert'].unstack().columns

jezrael 11.04.2018 14:26

Хорошо понял. Это означает, что если я не использую имя столбца значений в df.unstack (), я получу фрейм данных с каким-то образом мульти-иерархическим индексом на оси = 1?

Christian 11.04.2018 14:49

@Chris - Совершенно верно, и называется он Multiindex. Также, если несколько столбцов, этого невозможно избежать

jezrael 11.04.2018 14:50

Другие вопросы по теме