在熊猫中简单的交叉制表

问题描述 投票:22回答:2

我偶然发现了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

它们被加载到单独的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等...我可以得到总和或频率 - 我似乎无法得到两者......它变得有点复杂因为我想这样做在一个月的基础上,但我认为如果有人会如此友好地指出我正确的技术/方向,我将能够从那里去。

python pandas dataframe pivot-table
2个回答
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

请注意,Wes可能会指出sum已经过优化,你应该使用np.sum。


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,现在就会对此做一个说明。

© www.soinside.com 2019 - 2024. All rights reserved.