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

时间:2013-08-04 01:07:15

标签: pandas

我有需要收集总和和唯一计数统计数据的数据。数据的粗略格式如下所示:CSV:

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

我需要能够按客户(不使用PartType)汇总此表,并按年份对大小分箱中的客户进行总计和计数,并按年份按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,它一次只生成一年的总和或计数,所以当你打印其他年份的结果时,它们完全相同。

1 个答案:

答案 0 :(得分:0)

IIUC,你期待melt

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.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