我正在使用具有日期列和 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/