2016-11-29 4 views
1

Предположим, я создаю таблицу панды поворотную:Как сохранить индекс в панд сводной таблице

adults_per_hh= pd.pivot_table(data,index=["hh_id"],values=["adult"],aggfunc=np.sum) 
    adults_per_hh.shape 
    (1000,1) 

Я хочу, чтобы hh_id в качестве колонки в дополнение к взрослым. Каков наиболее эффективный способ сделать это?

ответ

0

Я думаю, что вам нужно reset_index, если использовать pivot_table, потому что первый столбец index:

print (data) 
    adult hh_id 
0  4  1 
1  5  1 
2  6  3 
3  1  2 
4  2  2 

print (pd.pivot_table(data,index=["hh_id"],values=["adult"],aggfunc=np.sum)) 
     adult 
hh_id  
1   9 
2   3 
3   6 

adults_per_hh= pd.pivot_table(data,index=["hh_id"],values=["adult"],aggfunc=np.sum) 
       .reset_index() 
print (adults_per_hh) 
    hh_id adult 
0  1  9 
1  2  3 
2  3  6 

Другим решением является использование groupby и агрегатный sum:

adults_per_hh = data.groupby("hh_id")["adult"].sum().reset_index() 
print (adults_per_hh) 
    hh_id adult 
0  1  9 
1  2  3 
2  3  6 

Настройка времени:

#random dataframe 
np.random.seed(100) 
N = 10000000 
data = pd.DataFrame(np.random.randint(50, size=(N,2)), columns=['hh_id','adult']) 
#[10000000 rows x 2 columns] 
print (data) 

In [60]: %timeit (pd.pivot_table(data,index=["hh_id"],values=["adult"],aggfunc=np.sum).reset_index()) 
1 loop, best of 3: 384 ms per loop 

In [61]: %timeit (data.groupby("hh_id", as_index=False)["adult"].sum()) 
1 loop, best of 3: 381 ms per loop 

In [62]: %timeit (data.groupby("hh_id")["adult"].sum().reset_index()) 
1 loop, best of 3: 355 ms per loop 
+0

Я не хочу 1000 столбцов. Я хочу 2 столбца, 1 столбец для hh_id и один столбец для числа взрослых. – lord12

+0

Хорошо, я отредактировал ответ, дайте мне сек. – jezrael

+0

Я добавляю время, кажется 'groupby' с' sum' и reset_index является самым быстрым. – jezrael

Смежные вопросы