2016-02-19 70 views
3

我在将数据转换为正确格式的特定问题时遇到了很多麻烦。将熊猫数据框转换为面板状结构

我的数据是这样的:

Date   Hour Category Col1 Col2 
1/1/10 1:00 1 France 1.1 1.2 
1/1/10 2:00 2 France 2.9 1.4 
1/1/10 1:00 1 UK  3.8 2.3 
2/1/10 1:00 1 France 1.4 1.0 
2/1/10 1:00 1 UK  1.1 0.1 
2/1/10 2:00 2 UK  1.2 0.4 
3/1/10 1:00 1 France 0.5 0.6 

我需要在最后的是:

  • 每一行必须对应一个唯一的夫妇(类别+小时)
  • 每一行都包含Pd.Series列表(每个Pd.series对应一个日期)。因此,列表的长度对应于与(分类+小时)
  • 列表中的每个元素是一个pd.Series对象含有其它值

匹配的天数(因此,它的相关的三维阵列或一个小组,但元素的列表中的号码可以改变)

输出结果是这样的:

Hour+Category Lists 
1+France   [[1/1/10 1.1 1.2] [2/1/10 1.4 1.0] [3/1/10 0.5 0.6]] 
2+France   [[1/1/10 2.9 1.4]] 
1+UK    [[1/1/10 3.8 2.3] [2/1/10 1.1 0.1] 
2+UK    [[2/1/10 1.2 0.4]] 

我的第一个尝试是:

X = X.group_by(['Hour','Category','Date']).first() 

这创建了一个多索引,我想这可能对重塑有帮助。 然后我可以用

X.to_panel() 

它创建了一个3D面板,但其中长轴和短轴是小时和类别。 否则我可以尝试

X.unstack(level = 2) 

具有与列感(小时+分类)和(日+ Col1中,日+ Col2中),然后取出NA值在每一行中,并保持之间的列的二维阵列只剩下剩余的价值。

但我仍在努力寻找更好的解决方案。 我也想过这样的事情,但我不能让它工作:

X = X.group_by(['Hour','Category']).apply(lambda x : 
[pd.Series(dict(???)) ] 

感谢您的帮助。

回答

0

以下似乎工作(你需要做一些列重命名,等等),但你想实现什么似乎对我来说很奇怪 - 把数据放入一个列表/数组中使其更难稍后使用。

print df.groupby(['Hour', 'Category']).apply(lambda subdf : subdf[['Date','Col1','Col2']].values).reset_index() 

    Hour Category             0 
0  1 France [[1/1/10, 1.1, 1.2], [2/1/10, 1.4, 1.0], [3/1/... 
1  1  UK   [[1/1/10, 3.8, 2.3], [2/1/10, 1.1, 0.1]] 
2  2 France        [[1/1/10, 2.9, 1.4]] 
3  2  UK        [[2/1/10, 1.2, 0.4]] 
+0

确实有效!非常感谢你。 我需要这种格式来将其插入深度学习库(如keras),这些库需要“序列列表”格式。 – cbournho