1

我有需要收集总和和唯一计数统计信息的数据。数据的粗略格式如下以 CSV 格式输入:

Customer     PartType        2011        2012       2013
A            widget_b        1000        10000      20000
B            widget_a        1           1000       5000
....

我需要能够按客户(没有 PartType)汇总此表,并按 YEAR 对大小箱中的客户进行总和和计数,以及按年份按 PART_TYPE 计算客户的相同练习。

几个问题:

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

Customer     PartType    Year     value
A            widget_b    2011     1000
A            widget_b    2012     10000
....

我想我可以用 pandas.pivot_table 做到这一点,但结果是 groupby 无法轻松处理的奇怪数据类型。

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

4

1 回答 1

0

IIUC,你正在寻找融化

melted = pd.melt(df, ["Customer", "PartType"])
melted.rename(columns={"variable": "Year"}, inplace=True)
melted = melted.sort("Customer").reset_index(drop=True)

从一个更有趣的开始DataFrame

>>> 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.meltunpivot 框架:

>>> 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
于 2013-08-04T01:39:46.163 回答