2012-03-06 90 views
22

我偶然發現了pandas,它對於我想要做的簡單計算來說很理想。我有一個SAS背景,並認爲它會取代proc freq - 它看起來會擴展到我未來可能要做的。然而,我似乎無法讓我的腦子圍繞一個簡單的任務(我不知道我是否應該看看pivot/crosstab/indexing - 是否應該有PanelDataFrames等)。可能有人給我如何做一些指針以下:簡單的熊貓交叉表

我有兩個CSV文件(一個2010年,一個於2011年 - 簡單的交易數據) - 該列類別和金額

2010:

AB,100.00 
AB,200.00 
AC,150.00 
AD,500.00 

2011:

AB,500.00 
AC,250.00 
AX,900.00 

這些被加載到單獨的數據幀的對象。

我想什麼做的就是類別,該類別的總和,該類別的頻率,例如:

2010:

AB,300.00,2 
AC,150.00,1 
AD,500.00,1 

2011:

AB,500.00,1 
AC,250.00,1 
AX,900.00,1 

我不能確定我是否應該使用pivot/crosstab/groupby/an index 等......我可以得到總和或頻率 - 我似乎無法得到兩者......它變得更復雜一點因爲我想每個月都這樣做,但我認爲如果有人願意指點我正確的技術/方向,我就可以從那裏開始。

+0

那麼你是說每個'.csv'文件只是一行,然後在這一行中第一個值是一年後跟上面提到的數據? – benjaminmgross 2012-03-07 15:08:33

+0

Hi Factor3,這就是S/O決定對它進行格式化的方式(我第一次使用它,所以將來必須注意這一點)...讓我澄清...有兩個文件 - 2010。 csv和2011.csv;這些包含'n'許多行,每行包含兩列。我試圖簡化這個問題 - 但是確實認爲現在我已經讀過它了,格式化有些誤導! – 2012-03-08 00:10:38

+0

我已經在這個[** Q&A **](https://stackoverflow.com/q/47152691/2336654)中提供了幾個詳細的示例和替代方法,您或其他人可能會發現有幫助。 – piRSquared 2017-11-11 22:21:17

回答

12

假設你有一個名爲2010.csv與內容

category,value 
AB,100.00 
AB,200.00 
AC,150.00 
AD,500.00 

然後,使用應用multiple aggregation functions following a groupby能力的文件,你可以說:

import pandas 
data_2010 = pandas.read_csv("/path/to/2010.csv") 
data_2010.groupby("category").agg([len, sum]) 

你應該得到的結果,看起來像

  value  
      len sum 
category    
AB   2 300 
AC   1 150 
AD   1 500 

請注意,韋斯可能會來點那總和已經優化了,你應該使用np.sum。

+0

這就是我需要的推動 - TY。我正在嘗試各種各樣的pivot_table(data_2010,rows ='???',aggfunc = {'???':'???'})等等......我有一種感覺,我太過複雜了。再次感謝。 – 2012-03-08 19:07:27

16

v0.21答案

使用pivot_tableindex參數:

df.pivot_table(index='category', aggfunc=[len, sum]) 

      len sum 
     value value 
category    
AB   2 300 
AC   1 150 
AD   1 500 

<= v0.12

這是可能做到這一點使用pivot_table對於那些有興趣:

In [8]: df 
Out[8]: 
    category value 
0  AB 100 
1  AB 200 
2  AC 150 
3  AD 500 

In [9]: df.pivot_table(rows='category', aggfunc=[len, np.sum]) 
Out[9]: 
      len sum 
      value value 
category    
AB   2 300 
AC   1 150 
AD   1 500 

需要注意的是結果的列層次索引。如果你有多個數據列,你會得到這樣的結果:

In [12]: df 
Out[12]: 
    category value value2 
0  AB 100  5 
1  AB 200  5 
2  AC 150  5 
3  AD 500  5 

In [13]: df.pivot_table(rows='category', aggfunc=[len, np.sum]) 
Out[13]: 
      len   sum   
      value value2 value value2 
category        
AB   2  2 300  10 
AC   1  1 150  5 
AD   1  1 500  5 

的主要原因使用__builtin__.sumnp.sum是,你得到NA-處理來自後者。可能可以攔截內置的Python,現在將對此進行說明。