我有下面的DataFrame,其中有超过300万行:
VALID_FROM VALID_TO VALUE
0 2022-01-01 2022-01-02 5
1 2022-01-01 2022-01-03 2
2 2022-01-02 2022-01-04 7
3 2022-01-03 2022-01-06 3
我想创建一个大的date_range,其中包含每个时间戳的值的总和。
对于上面的DataFrame,会得出:
dates val
0 2022-01-01 7
1 2022-01-02 14
2 2022-01-03 12
3 2022-01-04 10
4 2022-01-05 3
5 2022-01-06 3
但是,由于DataFrame有300万多行,我不想对每一行都进行迭代,而且我不知道如何在不进行迭代的情况下进行迭代。有什么建议吗?
目前我的程式码如下所示:
new_df = pd.DataFrame()
for idx, row in dummy_df.iterrows():
dr = pd.date_range(row["VALID_FROM"], end = row["VALID_TO"], freq = "D")
tmp_df = pd.DataFrame({"dates": dr, "val": row["VALUE"]})
new_df = pd.concat(objs=[new_df, tmp_df], ignore_index=True)
new_df.groupby("dates", as_index=False, group_keys=False).sum()
groupby的结果就是我想要的输出。
2条答案
按热度按时间qvtsj1bj1#
如果性能很重要,则对新行使用
Index.repeat
和DataFrame.loc
,创建date
列,计数器为GroupBy.cumcount
,最后聚合sum
:js4nwp542#
一种选择是构建一个日期列表,从原始 Dataframe 的最小值到最大值,使用带有conditional_join的非相等连接来获得匹配,最后使用groupby和sum: