python - 在多索引数据框中添加缺失日期索引

标签 python pandas dataframe

我正在使用具有日期列和 location_id 作为索引的多索引数据框。

index_1 = ['2020-01-01', '2020-01-03', '2020-01-04']
index_2 = [100,200,300]

index = pd.MultiIndex.from_product([index_1, 
index_2], names=['Date', 'location_id'])

df = pd.DataFrame(np.random.randint(10,100,9), index)
df

                         0
Date       location_id    
2020-01-01 100          19
           200          75
           300          39
2020-01-03 100          11
           200          91
           300          80
2020-01-04 100          36
           200          56
           300          54

我想填写缺少的日期,只有一个 location_id 并用 0 填充它:

                         0
Date       location_id    
2020-01-01 100          19
           200          75
           300          39
2020-01-02 100          0
2020-01-03 100          11
           200          91
           300          80
2020-01-04 100          36
           200          56
           300          54

我怎样才能做到这一点? This is helpful但前提是我的数据框不是多索引的。

最佳答案

您可以获得 unique 日期索引级别的值,使用 pd.date_range 生成最小值和最大值之间的所有日期并使用 difference 使用唯一的 Date 值来获取丢失的值。然后 reindex df 与 union 原始索引和 MultiIndex.from_product由缺少日期和 min 组成级别 location_id 的。

#unique dates
m = df.index.unique(level=0)
# reindex
df = df.reindex(df.index.union(
                   pd.MultiIndex.from_product([pd.date_range(m.min(), m.max())
                                                .difference(pd.to_datetime(m))
                                                .strftime('%Y-%m-%d'), 
                                             [df.index.get_level_values(1).min()]])), 
                fill_value=0)
print(df)
                 0
2020-01-01 100  91
           200  49
           300  19
2020-01-02 100   0
2020-01-03 100  41
           200  25
           300  51
2020-01-04 100  44
           200  40
           300  54

而不是 pd.MultiIndex.from_product ,您也可以使用 product来自 itertools .相同的结果,但可能更快。
from itertools import product
df = df.reindex(df.index.union(
                  list(product(pd.date_range(m.min(), m.max())
                                 .difference(pd.to_datetime(m))
                                 .strftime('%Y-%m-%d'),
                               [df.index.get_level_values(1).min()]))),
                fill_value=0)

关于python - 在多索引数据框中添加缺失日期索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62437346/

相关文章:

python - 使用 Pandas 将每日数据重新采样为每月(日期格式)

python - 删除 pandas 中的一系列行

python - 删除数据框python中的空间

javascript - 将大型 XML 文件转换为关系数据库

python - 删除停用词并标记化搭配bigramfinder NLTK

python - 替换 pandas 列中满足某些条件的值会导致SettingWithCopyWarning

python - Pandas/Numpy - 填充另一列的缺失值

python - 将一系列分类数据转换为具有包含类别和新 id 的多索引的数据框

python pandas groupby排序和连接

python - 从调用模块的位置获取当前路径