2013-08-04 58 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