pandas 中的简单交叉表

2024-01-21

我偶然发现pandas http://pandas.pydata.org/它看起来非常适合我想做的简单计算。我有 SAS 背景,并认为它会取代 proc freq - 看起来它会扩展到我将来可能想做的事情。然而,我似乎无法专注于一项简单的任务(我不确定我是否应该看看pivot/crosstab/indexing- 我是否应该有一个Panel or DataFramesETC...)。有人可以给我一些关于如何执行以下操作的指示:

我有两个 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 answer

Use 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__.sum vs. np.sum是你从后者获得 NA 处理。可能可以拦截Python内置的,现在会对此进行记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas 中的简单交叉表 的相关文章

随机推荐