2013-08-04 33 views
1

我有我需要收集总和和唯一计数统计的数据。该数据的粗略格式如下进来为CSV:熊猫 - 将键值列更改为键控行

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

我需要能够按客户(不PartType)汇总此表并逐年做客户之和计数大小的块,如以及每年按PART_TYPE统计客户的相同练习。

几个问题:

1)是否有使用熊猫进行,看起来像一个数据帧的一个简单的方法:

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

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

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

回答

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到unpivot的框架:

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