2016-05-25 2 views
3

У меня есть кадр данных pandas, который является результатом поворота. Он имеет несколько индексов. Я хочу получить «нормальный» кадр данных из этого поворотного df ... так что я могу выполнить некоторые обычные операции над новым df.восстановить нормальный кадр данных после поворота кадра данных

Вот пример: Мой повернута кадр данных выглядит следующим образом:

     feature_value 
feature_type   f1 f2 f3 f4 f5 
time   name 
2016-05-10 Clay  0 1 30 4 40 
2016-05-10 John  0 4 10 4 66 
2016-05-10 Mary  0 1 40 4 46 
2016-05-10 Boby  2 0 30 4 59 
2016-05-10 Lucy  5 8 20 4 41 

Ниже то, что я хочу, как новый ДФ:

time   name  f1 f2 f3 f4 f5 
2016-05-10 Clay  0 1 30 4 40 
2016-05-10 John  0 4 10 4 66 
2016-05-10 Mary  0 1 40 4 46 
2016-05-10 Boby  2 0 30 4 59 
2016-05-10 Lucy  5 8 20 4 41 

Как я могу это сделать?

pivoted_df.to_dict() выглядит следующим образом:

{('feature_value', 'f1'): {(Timestamp('2016-05-10'), 'Clay'): 0, (Timestamp('2016-05-10'), 'John'): 0, (Timestamp('2016-05-10'), 'Mary'): 0, (Timestamp('2016-05-10'), 'Boby'): 2, (Timestamp('2016-05-10'), 'Lucy'): 5}, ('feature_value', 'f2'): {(Timestamp('2016-05-10'), 'Clay'): 1, (Timestamp('2016-05-10'), 'John'): 4, (Timestamp('2016-05-10'), 'Mary'): 1, (Timestamp('2016-05-10'), 'Boby'): 0, (Timestamp('2016-05-10'), 'Lucy'): 8}, ('feature_value', 'f3'): {(Timestamp('2016-05-10'), 'Clay'): 30, (Timestamp('2016-05-10'), 'John'): 10, (Timestamp('2016-05-10'), 'Mary'): 40, (Timestamp('2016-05-10'), 'Boby'): 30, (Timestamp('2016-05-10'), 'Lucy'): 20}, ('feature_value', 'f4'): {(Timestamp('2016-05-10'), 'Clay'): 4, (Timestamp('2016-05-10'), 'John'): 4, (Timestamp('2016-05-10'), 'Mary'): 4, (Timestamp('2016-05-10'), 'Boby'): 4, (Timestamp('2016-05-10'), 'Lucy'): 4}, ('feature_value', 'f5'): {(Timestamp('2016-05-10'), 'Clay'): 40, (Timestamp('2016-05-10'), 'John'): 66, (Timestamp('2016-05-10'), 'Mary'): 46, (Timestamp('2016-05-10'), 'Boby'): 59, (Timestamp('2016-05-10'), 'Lucy'): 41}} 
+0

В принципе 'unstack' - это обратная операция' pivot', см .: http://www.nikgrozev.org/2015/07/01/reshaping-in-pandas-pivot-pivot-table-stack- and-unstack-explain-with-pictures/ – IanS

+0

можете ли вы опубликовать вывод 'pivoted_df.to_dict()'? – MaxU

+0

@MaxU: обновлен с выводом pivoted_df.to_dict(). – user1717931

ответ

4

При вызове pivot_table, убедитесь, что вы указали values параметр:

df.pivot_table(index=['time', 'name'], columns=['feature_type'], 
       values='feature_value') 

без values='feature_value', вы получите Индекс столбцов MultiIndex с (возможно) единственным внешним уровнем, таким как 'feature_value'.

df.pivot_table(index=['time', 'name'], ...) также вернет DataFrame с индексом строки MultiIndex с уровнями time и name. Для того, чтобы эти уровни индекса регулярные колонки, вызовите reset_index():

result = df.pivot_table(index=['time', 'name'], 
         columns=['feature_type'], 
         values='feature_value').reset_index() 

Например с,

import numpy as np 
import pandas as pd 
np.random.seed(2016) 

N = 10 
df = pd.DataFrame(
    {'time': np.random.choice(pd.date_range('2016-05-10', '2016-05-12'), size=N), 
    'name': np.random.choice(['Clay', 'John', 'Mary', 'Boby', 'Lucy'], size=N), 
    'feature_type': np.random.choice(['f{}'.format(i) for i in range(1,6)], size=N), 
    'feature_value': np.random.randint(100, size=N)}) 

orig = df.pivot_table(index=['time', 'name'], columns=['feature_type']) 
print(orig) 

alt = df.pivot_table(index=['time', 'name'], 
        columns=['feature_type'], 
        values='feature_value').reset_index() 
alt.columns.name = None 
print(alt) 

orig выглядит следующим образом:

   feature_value       
feature_type    f1 f2 f3 f4 f5 
time  name          
2016-05-10 John   NaN 50.0 NaN NaN 91.0 
      Lucy   NaN NaN NaN 28.0 NaN 
      Mary   NaN NaN 19.0 NaN 27.0 
2016-05-11 Clay   2.0 NaN NaN NaN NaN 
      Lucy   24.0 NaN NaN NaN NaN 
2016-05-12 Boby   NaN 16.0 NaN NaN NaN 
      John   NaN NaN NaN NaN 62.0 
      Mary   NaN NaN NaN 84.0 NaN 

в то время как alt выглядит

 time name f1 f2 f3 f4 f5 
0 2016-05-10 John NaN 50.0 NaN NaN 91.0 
1 2016-05-10 Lucy NaN NaN NaN 28.0 NaN 
2 2016-05-10 Mary NaN NaN 19.0 NaN 27.0 
3 2016-05-11 Clay 2.0 NaN NaN NaN NaN 
4 2016-05-11 Lucy 24.0 NaN NaN NaN NaN 
5 2016-05-12 Boby NaN 16.0 NaN NaN NaN 
6 2016-05-12 John NaN NaN NaN NaN 62.0 
7 2016-05-12 Mary NaN NaN NaN 84.0 NaN 
+0

awesome! Работает отлично. – user1717931

2

Грубая сила:

df.columns = df.columns.droplevel() 
df = df.reset_index() 
Смежные вопросы