我有一个看起来像这样的数据框:
>> df
index week day hour count
5 10 2 10 70
5 10 3 11 80
7 10 2 18 15
7 10 2 19 12
其中week
是一年中的星期几,day
是星期几(0-6
),而hour
是一天中的小时数({{1} }。但是,由于我计划在以后将其转换为3D数组(周x天x小时),因此我必须在0-23
列中包括没有项目的小时。示例:
count
,依此类推。我要做的是生成一个虚拟数据框,其中包含所有可能的索引-星期-天-小时组合(基本上是>> target_df
index week day hour count
5 10 0 0 0
5 10 0 1 0
...
5 10 2 10 70
5 10 2 11 0
...
7 10 0 0 0
...
...
,而没有target_df
列):
count
然后使用
>> dummy_df
index week day hour
5 10 0 0
5 10 0 1
...
5 10 2 10
5 10 2 11
...
7 10 0 0
...
...
这对于小型数据集工作正常,但是我正在处理很多行。就我现在正在处理的情况而言,target_df = pd.merge(df, dummy_df, on=['index','week','day','hour'], how='outer').fillna(0)
和dummy_df
的行数为8200万,而且速度很慢。
EDIT :最慢的部分实际上是在构建target_df
!我可以生成单个列表,但是将它们组合到熊猫数据框中是最慢的部分。
dummy_df
有更快的方法吗?
答案 0 :(得分:1)
或者,您可以使用itertools.product
作为列表的乘积来创建dummy_df
:
import itertools
index = range(100)
weeks = range(53)
days = range(7)
hours = range(24)
dummy_df = pd.DataFrame(list(itertools.product(index, weeks, days, hours)), columns=['index','week','day','hour'])
dummy_df.head()
0 1 2 3
0 0 0 0 0
1 0 0 0 1
2 0 0 0 2
3 0 0 0 3
4 0 0 0 4