Pandas 熊猫-将键值列更改为键控行

Pandas 熊猫-将键值列更改为键控行,pandas,Pandas,我有需要收集总和和唯一计数统计数据的数据。数据的大致格式如下所示,以CSV形式出现: Customer PartType 2011 2012 2013 A widget_b 1000 10000 20000 B widget_a 1 1000 5000 .... 我需要能够按客户(不含零件类型)汇总此表,并按年度对尺寸箱

我有需要收集总和和唯一计数统计数据的数据。数据的大致格式如下所示,以CSV形式出现:

Customer     PartType        2011        2012       2013
A            widget_b        1000        10000      20000
B            widget_a        1           1000       5000
....
我需要能够按客户(不含零件类型)汇总此表,并按年度对尺寸箱中的客户进行合计和计数,以及按零件类型按年度对客户进行计数

有几个问题:

1) 是否有一种简单的方法可以使用pandas制作如下所示的数据帧:

Customer     PartType    Year     value
A            widget_b    2011     1000
A            widget_b    2012     10000
....
我想我可以用pandas.pivot_表实现这一点,但是结果是一个奇怪的数据类型,groupby无法轻松处理

2) 是否有一种简单的方法可以在客户规模的存储桶中按年生成总和和计数?我在groupby方法中使用了pd.cut,它一次只生成一年的总和或计数,因此当您打印其他年份的结果时,它们完全相同。

IIUC,您希望:


从稍微有趣的
数据帧开始:

>>> df
  Customer  PartType  2011   2012   2013
0        A  widget_b  1000  10000  20000
1        B  widget_a     1   1000   5000
2        B  widget_c   111    222    333
我们使用
pd.melt
解除框架的锁定:

>>> melted = pd.melt(df, ["Customer", "PartType"])
>>> melted
  Customer  PartType variable  value
0        A  widget_b     2011   1000
1        B  widget_a     2011      1
2        B  widget_c     2011    111
3        A  widget_b     2012  10000
4        B  widget_a     2012   1000
5        B  widget_c     2012    222
6        A  widget_b     2013  20000
7        B  widget_a     2013   5000
8        B  widget_c     2013    333
但是,它有一个无聊的名称
“variable”
,而且它的顺序不是我们想要的。这很容易修复:

>>> melted.rename(columns={"variable": "Year"}, inplace=True)
>>> melted = melted.sort("Customer").reset_index(drop=True)
>>> melted
  Customer  PartType  Year  value
0        A  widget_b  2013  20000
1        A  widget_b  2012  10000
2        A  widget_b  2011   1000
3        B  widget_a  2012   1000
4        B  widget_c  2012    222
5        B  widget_a  2013   5000
6        B  widget_c  2013    333
7        B  widget_a  2011      1
8        B  widget_c  2011    111
我不确定我是否完全遵循了您想要的聚合,但您应该能够根据自己的喜好应用
groupby
。例如:

>>> melted.groupby(["Customer", "Year"]).sum()
               value
Customer Year       
A        2011   1000
         2012  10000
         2013  20000
B        2011    112
         2012   1222
         2013   5333
>>> melted.groupby(["Customer", "Year"]).sum()
               value
Customer Year       
A        2011   1000
         2012  10000
         2013  20000
B        2011    112
         2012   1222
         2013   5333