如何创建包含范围内但不在索引中的日期的 MultiIndex 的笛卡尔积

Posted

技术标签:

【中文标题】如何创建包含范围内但不在索引中的日期的 MultiIndex 的笛卡尔积【英文标题】:How to create cartesian product of a MultiIndex including dates within a range but not in the Index 【发布时间】:2019-12-10 14:32:35 【问题描述】:

我有一个带有 MultiIndex(日期、状态和文章)和值列(数量)的 DataFrame。我需要对 DataFrame 进行上采样,以在一个范围组合内为每个州、文章和日期包含一行。这样我就可以对每一行进行滚动求和。

我尝试使用 pd.MultiIndex.from_product(df.index.levels) 创建一个新索引并用它重新索引我的 DataFrame,但如果原始 DataFrame 中缺少该范围内的某些日期,它将没有所有必要的行。

我还尝试使用pd.date_range 创建一个列表,然后在 GroupBy 对象上使用apply 重新索引每个部分。但是没有成功。

最后,我还考虑将完整日期列表的空白行附加到 DataFrame 中,但这会导致我的州和文章级别出现空白。

这是我现在拥有的:

DF:

                             quantity
    date       state article
    2019-06-02 CA    3431    12
    2019-06-04 CA    2584    48

代码:

complete_index = pd.MultiIndex.from_product(df.index.levels, names=index_cols)
df = df.reindex(complete_index)

输出:

                             quantity
    date       state article
    2019-06-02 CA    3431    12
    2019-06-04 CA    3431    
    2019-06-02 CA    2584
    2019-06-04 CA    2584    48

范围在最小和最大日期(含)之间的所需输出:

                             quantity
    date       state article
    2019-06-02 CA    3431    12
    2019-06-03 CA    3431
    2019-06-04 CA    3431
    2019-06-02 CA    2584
    2019-06-03 CA    2584    
    2019-06-04 CA    2584    48

【问题讨论】:

【参考方案1】:

这是通过groupby 然后reindex 创建索引的一种方法

df1=df.reset_index().copy()
import functools
l=[pd.MultiIndex.from_product([pd.date_range(y.date.min(),y.date.max()),[x],y.article.unique()]) for x , y in df1.groupby('state') ]
idx=functools.reduce(lambda x , y : x.append(y),l)
df=df.reindex(idx)
                    quantity
2019-06-02 CA 3431      12.0
              2584       NaN
2019-06-03 CA 3431       NaN
              2584       NaN
2019-06-04 CA 3431       NaN
              2584      48.0

【讨论】:

以上是关于如何创建包含范围内但不在索引中的日期的 MultiIndex 的笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章

浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

日期范围查询的 SQL 索引

浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

从隐藏在多索引中的年月创建日期时间

尽量不在 SQL 查询中硬编码日期范围(Python、SQL 服务器)

在 SQL 中选择不在 Group By 中的列