簡體   English   中英

在熊貓中簡單的交叉制表

[英]Simple cross-tabulation in pandas

我偶然發現了大熊貓 ,它看起來很適合我想做的簡單計算。 我有一個SAS背景,並且認為它取代了proc freq - 看起來它將擴展到我將來可能要做的事情。 但是,我似乎無法DataFrames一個簡單的任務(我不確定我是否應該查看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

它們被加載到單獨的DataFrame對象中。

我想做的是獲取類別,類別的總和以及類別的頻率,例如:

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等...我可以得到總和或頻率 - 我似乎無法得到兩者......它變得有點復雜因為我想逐個月地做這件事,但我想如果有人能夠如此友好地指出我能夠從那里出發的正確技術/方向。

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,現在就會對此做一個說明。

假設您有一個名為2010.csv的文件,其中包含內容

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

然后,使用在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

請注意,Wes可能會指出sum已經過優化,你應該使用np.sum。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM