2017-06-27 41 views
0

爲了更好地解決問題,我們假設我有一家店鋪有3位獨特顧客,我的數據框包含每位顧客購買的平日,姓名和付款價格。爲零組合後的唯一多指標值的組合填充零值

 name price weekday 
0 Paul 18.44  0 
1 Micky 0.70  0 
2 Sarah 0.59  0 
3 Sarah 0.27  1 
4 Paul 3.45  2 
5 Sarah 14.03  2 
6 Paul 17.21  3 
7 Micky 5.35  3 
8 Sarah 0.49  4 
9 Micky 17.00  4 
10 Paul 2.62  4 
11 Micky 17.61  5 
12 Micky 10.63  6 

我想獲得的信息是每個獨立客戶每個工作日的平均價格。我經常做類似的情況是通過集團與和幾列,然後採取列的子集的平均水平。

df = df.groupby(['name','weekday']).sum() 



       price 
name weekday  
Micky 0   0.70 
     3   5.35 
     4  17.00 
     5  17.61 
     6  10.63 
Paul 0  18.44 
     2   3.45 
     3  17.21 
     4   2.62 
Sarah 0   0.59 
     1   0.27 
     2  14.03 
     4   0.49 

df = df.groupby(['weekday']).mean() 

      price 
weekday   
0   6.576667 
1   0.270000 
2   8.740000 
3  11.280000 
4   6.703333 
5  17.610000 
6  10.630000 

當然,這隻適用於所有我的獨特客戶每天至少有一次購買。 有一種優雅的方式來獲得具有第一GROUPBY後沒有和唯一索引值之間的所有組合零值?

我的解決方案到目前爲止都是爲了重新索引一個多索引,我通過分組列的獨特值或者unstack-fillna-stack的組合創建了索引,但這兩種解決方案都不能滿足我。

感謝您的幫助!

回答

1

IIUC,讓我們使用unstackfillna然後stack

df_out = df.groupby(['name','weekday']).sum().unstack().fillna(0).stack() 

輸出:

   price 
name weekday  
Micky 0   0.70 
     1   0.00 
     2   0.00 
     3   5.35 
     4  17.00 
     5  17.61 
     6  10.63 
Paul 0  18.44 
     1   0.00 
     2   3.45 
     3  17.21 
     4   2.62 
     5   0.00 
     6   0.00 
Sarah 0   0.59 
     1   0.27 
     2  14.03 
     3   0.00 
     4   0.49 
     5   0.00 
     6   0.00 

而且,

df_out.groupby('weekday').mean() 

輸出:

  price 
weekday   
0  6.576667 
1  0.090000 
2  5.826667 
3  7.520000 
4  6.703333 
5  5.870000 
6  3.543333 
1

我認爲您可以使用pivot_table一次完成所有步驟。我不太確定你想要什麼,但來自pivot_table默認聚合是平均值。你可以將它更改爲「總和」。

df1 = df.pivot_table(index='name', columns='weekday', values='price', 
        fill_value=0, aggfunc='sum') 

weekday  0  1  2  3  4  5  6 
name             
Micky  0.70 0.00 0.00 5.35 17.00 17.61 10.63 
Paul  18.44 0.00 3.45 17.21 2.62 0.00 0.00 
Sarah  0.59 0.27 14.03 0.00 0.49 0.00 0.00 

再取每列的平均值。

df1.mean() 

weekday 
0 6.576667 
1 0.090000 
2 5.826667 
3 7.520000 
4 6.703333 
5 5.870000 
6 3.543333