如何在pandas数据透视表中保留索引

时间:2016-11-29 06:58:44

标签: pandas

假设我创建了一个pandas数据透视表:

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

除了成人之外,我想将hh_id保留为专栏。最有效的方法是什么?

1 个答案:

答案 0 :(得分: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