将Panda DataFrame转换为类似于Panel的结构

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对象
(因此,它与3D数组或Panel有关,但列表中的元素数量可能会改变)
输出将类似于以下内容:
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()

创建一个三维面板,其中主轴和副轴是小时和类别。否则我可以尝试。
X.unstack(level = 2)

要创建一个二维数组,其中列为(小时+类别),列位于(日期+列1,日期+列2)之间,然后删除每行中的NA值,并仅保留剩余值。

但我仍在尝试寻找更好的解决方案。 我也考虑过类似这样的方法,但我无法使其正常工作:

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

感谢您的帮助。
1个回答

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

确实可以工作!非常感谢。我需要它以这种格式,以便将其插入到要求“序列列表”格式的深度学习库(如keras)中。 - cbournho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接