2015-06-26 139 views
4

的百分比這是我的數據在數據幀「DF」:熊貓Pivot_Table:行計算非數值

Document Name Time 
SPS2315511 A 1 HOUR 
SPS2315512 B 1 - 2 HOUR 
SPS2315513 C 2 - 3 HOUR 
SPS2315514 C 1 HOUR 
SPS2315515 B 1 HOUR 
SPS2315516 A 2 - 3 HOUR 
SPS2315517 A 1 - 2 HOUR 

我使用下面的代碼給我算的彙總數據透視表中,

table = pivot_table(df, values=["Document"], index=["Name"],columns=["Time"], aggfunc=lambda x: len(x), margins=True, dropna=True) 

,但我想要的是行計算%爲Excel數據透視當你右擊樞軸,並選擇「顯示值 - >行彙總的百分比」。由於我的文檔是一個非數字值,我無法得到它。

預期的結果:

Count of Document Column Labels 

Name 1 HOUR 1 - 2 HOUR 2 - 3 HOUR Grand Total 
A 33.33% 33.33% 33.33% 100.00% 
B 50.00% 50.00% 0.00% 100.00% 
C 50.00% 0.00% 50.00% 100.00% 
Grand Total 42.86% 28.57% 28.57% 100.00% 

任何一個可以請幫我想出一個辦法來得到這樣的結果?

我試圖操縱這將給我行總計,而不是從數據幀中的數據和我想要的是「行共%」樞軸數據。也是最重要的我所有的數據都是非數值...

+1

[如何將pandas列的值除以另一列]的可能重複(http://stackoverflow.com/questions/15916612/how-to-divide-the-value-of-pandas-columns-by -the-其他列) – maxymoo

+0

你其實可以只通過'aggfunc = len',因爲'len'已經是一個功能:) – maxymoo

+0

嗨maxymoo在你給了他們操縱從數據框列的一個鏈接,但我的問題是不同的我想操縱的數據,這將給我行總數,我想要的是「行總數的百分比」。也是最重要的我所有的數據都是非數值... –

回答

4

通過@maxymoo注意可能的重複是非常接近的解決方案,但我會繼續前進,它寫了一個答案,因爲有一個幾個不完全直截了當的差異。

table = pd.pivot_table(df, values=["Document"], index=["Name"],columns=["Time"], 
         aggfunc=len, margins=True, dropna=True,fill_value=0) 

     Document      
Time 1 - 2 HOUR 1 HOUR 2 - 3 HOUR All 
Name         
A    1  1   1 3 
B    1  1   0 2 
C    0  1   1 2 
All   2  3   2 7 

主要的調整有加fill_value=0因爲你真的想有什麼是零計數值,而不是一個NaN的。

然後,你可以基本上使用解決方案@maxymoo鏈接到,但你需要使用iloc或類似的b/c表的列現在有點複雜(是數據透視表的多索引結果)。

table2 = table.div(table.iloc[:,-1], axis=0) 

     Document       
Time 1 - 2 HOUR 1 HOUR 2 - 3 HOUR All 
Name          
A  0.333333 0.333333 0.333333 1 
B  0.500000 0.500000 0.000000 1 
C  0.000000 0.500000 0.500000 1 
All 0.285714 0.428571 0.285714 1 

你還有一些細微的格式化工作,在那裏做(翻轉第一和第二列,並轉換爲%),但這些都是你正在尋找的數字。

順便提一下,這裏沒有必要,但是你可能想考慮把'時間'轉換爲有序的分類變量,這將是解決列排序問題的一種方法(我認爲),但可能會也可能不會值得麻煩,這取決於你對數據做了什麼。

+0

感謝您的答覆和補充說明,你的方法也適用.. –