将 Panda DataFrame 转换为类面板结构
Convert Panda DataFrame to Panel-like structure
我在将数据重塑为正确格式的特定问题上遇到了很多麻烦。
我有这样的数据:
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对应一个日期)。因此,列表的长度对应于与 (Category+Hour)
匹配的天数
- 列表中的每个元素都是一个 pd.Series 包含其他值的对象
(因此,它与 3D 数组或面板有关,但列表中的元素数量可以更改)
输出会是这样的:
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)
创建一个二维数组,其列为 (Hour+Category),列介于 (Day+Col1, Day+Col2) 之间,然后删除每行中的 NA 值并仅保留剩余的值。
但我仍在努力寻找更好的解决方案。
我也想到了类似的东西,但是我做不出来:
X = X.group_by(['Hour','Category']).apply(lambda x :
[pd.Series(dict( ???)) ]
感谢您的帮助。
以下内容似乎可行(您需要对列进行重命名等),但您想要实现的目标对我来说似乎很奇怪——将数据作为 list/array 放入系列中使以后更难使用。
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]]
我在将数据重塑为正确格式的特定问题上遇到了很多麻烦。
我有这样的数据:
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对应一个日期)。因此,列表的长度对应于与 (Category+Hour) 匹配的天数
- 列表中的每个元素都是一个 pd.Series 包含其他值的对象
(因此,它与 3D 数组或面板有关,但列表中的元素数量可以更改)
输出会是这样的:
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)
创建一个二维数组,其列为 (Hour+Category),列介于 (Day+Col1, Day+Col2) 之间,然后删除每行中的 NA 值并仅保留剩余的值。
但我仍在努力寻找更好的解决方案。 我也想到了类似的东西,但是我做不出来:
X = X.group_by(['Hour','Category']).apply(lambda x :
[pd.Series(dict( ???)) ]
感谢您的帮助。
以下内容似乎可行(您需要对列进行重命名等),但您想要实现的目标对我来说似乎很奇怪——将数据作为 list/array 放入系列中使以后更难使用。
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]]