【问题标题】:How to use crosstab/pivot with multi dimensions如何使用多维交叉表/数据透视表
【发布时间】:2013-09-24 16:14:30
【问题描述】:

我尝试使用数据透视表在 pivot_table 函数的“值”字段中有多个值,但它不起作用,所以我想看看我是否可以使用交叉表来做到这一点。 这是我的代码

table=pandas.pivot_table(xl2, values='Applications', rows='Sub-Product',cols='Application Date',aggfunc=numpy.sum)

我在导出到 csv 时得到这个。

  Sub-Product   11/1/12 11/2/12 11/3/12
    GP            190    207      65
    GPF           1391   1430     1269

在python中,将其转换为数据透视表后,dtype为float64()并使用

<class 'pandas.core.frame.DataFrame'>

我最终想要的是 csv 中的这个输出:

Row Labels  11/1/2012   11/2/2012   11/3/2012
GP          
Acquisitions    164        168          54
Applications    190        207          65
GPF         
Acquisitions    1124       1142         992
Applications    1391       1430         1269

使用与此类似的代码(目前它不起作用:/):

table=pd.pivot_table(xl2, values=['Acquisitions','Applications'], rows=['Sub-Product'],cols=['Application Date'],aggfunc=np.sum)

但我只能得到这个:

Sub-Product ('Applications', Timestamp('2012-11-01 00:00:00', tz=None)) ('Applications', Timestamp('2012-11-02 00:00:00', tz=None)) ('Applications', Timestamp('2012-11-03 00:00:00', tz=None))
GP  190 207 65
GPF 1391    1430    1269

关于交叉表如何提供帮助的任何想法? :S


这是 csv 文件中的数据。我不知道为什么我不能把它们变成正确的数据框格式。

Application Date    Sub-Product Applications    Acquisitions
11/1/12             GP                1            1
11/1/12             GP                1            1
11/1/12             GP                1            1
11/1/12             GP                1            1
11/1/12             GPF               1            1
11/1/12             GPF               1            1
11/1/12             GPF               1            1
11/1/12             GPF               1            1

【问题讨论】:

  • 其他数字从何而来? (您想要的视图不是查看 DataFrames 的标准方式,尽管您可以在拥有正确的 DataFrame 后创建类似的 csv...)
  • 安迪,我可以把原始的 csv 文件发给你,让你测试一下吗?
  • 是否可以只提供前十几行左右(或者复制上述结果的多行)并将它们编辑到您的问题中? :)
  • 添加了 csv 文件的 sn-p
  • 感谢编辑!啊,我明白了。所以你已经用xl2 = pd.read_csv('your_file.csv', sep='\s+') 创建了一个DataFrame?

标签: python csv pandas pivot-table crosstab


【解决方案1】:

看起来你真的很接近你想去的地方。 table.stack(0) 会将列索引的第一级移动到行索引。

In [1]: import pandas as pd
In [2]: from StringIO import StringIO
In [3]: df = pd.read_csv(StringIO("""\
   ...: Application-Date    Sub-Product       Applications    Acquisitions
   ...: 11/1/12             GP                1            1
   ...: 11/1/12             GPF               1            1
   ...: 11/2/12             GP                1            1
   ...: 11/2/12             GP                1            1
   ...: 11/2/12             GPF               1            1
   ...: 11/2/12             GPF               1            1
   ...: 11/3/12             GP                1            1
   ...: 11/3/12             GP                1            1
   ...: 11/3/12             GP                1            1
   ...: 11/3/12             GPF               1            1
   ...: 11/3/12             GPF               1            1
   ...: 11/3/12             GPF               1            1
   ...: """), sep='\s+', parse_dates=[0])
In [4]: table = df.pivot_table(values=['Acquisitions', 'Applications'],
   ...:                        rows='Sub-Product',
   ...:                        cols='Application-Date',
   ...:                        aggfunc=sum)
In [5]: table
Out[5]: 
                  Applications                          Acquisitions                        
Application-Date    2012-11-01  2012-11-02  2012-11-03    2012-11-01  2012-11-02  2012-11-03
Sub-Product                                                                                 
GP                           1           2           3             1           2           3
GPF                          1           2           3             1           2           3
In [6]: table.stack(0)
Out[6]: 
Application-Date          2012-11-01  2012-11-02  2012-11-03
Sub-Product                                                 
GP          Applications           1           2           3
            Acquisitions           1           2           3
GPF         Applications           1           2           3
            Acquisitions           1           2           3

【讨论】:

  • @Garrett,你知道我如何按周分组日期吗?
  • 尝试ds = df.set_index('Application-Date') 制作时间序列索引数据框,然后ds.groupby('Sub-Product').resample("W", how=sum).reset_index()
  • 好的,如果我只想从 2012/11/4 开始,第一周是 2012/11/4-2012/11/10,第二周是 2012/11/ 11-2012/11/17
  • 认为您想将 label='left', closed='left' 传递给 resample()。超过一天的时间段的默认值为label='right', closed='right'。请参阅pandas.pydata.org/pandas-docs/stable/whatsnew.html#id3 了解有关重采样到每日频率和更快频率的一些详细信息
  • 我想在它们转换成数据透视表后按日期对它们进行分组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2015-07-13
  • 2012-04-07
  • 1970-01-01
相关资源
最近更新 更多