如何创建包含范围内但不在索引中的日期的 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 索引多范围查找)查询优化
浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化