【问题标题】:Simple cross-tabulation in pandaspandas 中的简单交叉表
【发布时间】:2012-03-24 04:54:56
【问题描述】:

我偶然发现了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 等等......我可以得到总和或频率 - 我似乎无法同时得到......它变得有点复杂,因为我想每月做一次,但我想如果有人很乐意为我指出正确的技术/方向,我将能够从那里开始。

【问题讨论】:

  • 那么您是说每个.csv 文件只是一行,然后在该行中,第一个值是年份,后面是您在上面显示的数据?
  • 嗨 Factor3,这正是 S/O 决定格式化它的方式(我第一次使用它,所以将来必须注意它)......让我澄清一下...... . 有两个文件 - 2010.csv 和 2011.csv;这些包含“n”多行,每行包含两列。我试图简化问题 - 但我同意格式有点误导,因为我已经读回来了!
  • 我在Q&A 中提供了几个详细的示例和替代方法,您或其他人可能会觉得有帮助。

标签: python pandas dataframe pivot-table


【解决方案1】:

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 内置,现在将对此进行说明。

【讨论】:

    【解决方案2】:

    假设您有一个名为 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。

    【讨论】:

    • 这就是我需要的推动力 - TY。我正在尝试使用 pivot_table(data_2010, rows='???', aggfunc={'???': '???'}) 等各种方法......我觉得我让问题过于复杂了。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2013-07-25
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多