我有需要收集总和和唯一计数统计数据的数据。数据的粗略格式如下所示: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,它一次只生成一年的总和或计数,所以当你打印其他年份的结果时,它们完全相同。
答案 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