2016-08-15 4 views
3

я следующий кадром данных (реальный кадр данных гораздо больше, больше, чем этот):Как избавиться от многоуровневого индекса после использования pandas pivat table?

sale_user_id sale_product_id count 
1     1    1 
1     8    1 
1     52    1 
1     312   5 
1     315   1 

Затем изменил его, чтобы переместить значения в sale_product_id как заголовки столбцов, используя следующий код:

reshaped_df=id_product_count.pivot(index='sale_user_id',columns='sale_product_id',values='count') 

и полученный фрейм данных:

sale_product_id -1057 1 2 3 4 5 6 8 9 10 ... 98 980 981 982 983 984 985 986 987 99 
sale_user_id                      
1    NaN 1.0 NaN NaN NaN NaN NaN 1.0 NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
3    NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
4    NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 

, как вы можете видеть, у нас есть индекс multililevel, что мне нужно, чтобы иметь sale_user_is в е рвый колонок без многоуровневого индексирования:

я принять следующий подход:

reshaped_df.reset_index() 

результата будет, как это я до сих пор есть столбец sale_product_id, но я не нужен больше:

sale_product_id sale_user_id -1057 1 2 3 4 5 6 8 9 ... 98 980 981 982 983 984 985 986 987 99 
0       1 NaN 1.0 NaN NaN NaN NaN NaN 1.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
1       3 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
2       4 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 

Я могу подмножить этот фрейм данных, чтобы избавиться от sale_product_id, но я не думаю, что это было бы эффективно. Я ищу эффективный способ избавиться от многоуровневой индексации при изменении формы исходного кадра

ответ

2

Вы должны удалить только index name, используйте rename_axis (новый в pandas0.18.0):

print (reshaped_df) 
sale_product_id 1 8 52 312 315 
sale_user_id        
1     1 1 1 5 1 

print (reshaped_df.index.name) 
sale_user_id 

print (reshaped_df.rename_axis(None)) 
sale_product_id 1 8 52 312 315 
1     1 1 1 5 1 

Другое решение работает в панд ниже 0.18.0:

reshaped_df.index.name = None 
print (reshaped_df) 

sale_product_id 1 8 52 312 315 
1     1 1 1 5 1 

Если необходимо удалить columns name также:

print (reshaped_df.columns.name) 
sale_product_id 

print (reshaped_df.rename_axis(None).rename_axis(None, axis=1)) 
    1 8 52 312 315 
1 1 1 1 5 1 

Другое решение:

reshaped_df.columns.name = None 
reshaped_df.index.name = None 
print (reshaped_df) 
    1 8 52 312 315 
1 1 1 1 5 1 

EDIT замечанием:

Вам необходимо reset_index с параметром drop=True:

reshaped_df = reshaped_df.reset_index(drop=True) 
print (reshaped_df) 
sale_product_id 1 8 52 312 315 
0     1 1 1 5 1 

#if need reset index nad remove column name 
reshaped_df = reshaped_df.reset_index(drop=True).rename_axis(None, axis=1) 
print (reshaped_df) 
    1 8 52 312 315 
0 1 1 1 5 1 

Из если нужно удалить только имя столбца:

reshaped_df = reshaped_df.rename_axis(None, axis=1) 
print (reshaped_df) 
       1 8 52 312 315 
sale_user_id       
1    1 1 1 5 1 

редактировать 1:

Так что, если нужно создать новый столбец из index и удалить columns names:

reshaped_df = reshaped_df.rename_axis(None, axis=1).reset_index() 
print (reshaped_df) 
    sale_user_id 1 8 52 312 315 
0    1 1 1 1 5 1 
+0

Я пытался все решения, actulally первых два решения удалить sale_user_id, но мне нужно это как первый столбец, мне нужно, чтобы избавиться от of sale_product_id. – sanaz

+0

и последние два решения также удалить sale_user_id – sanaz

+0

Пожалуйста, проверьте мои изменения. – jezrael