我有一个多索引数据框:
tuples = list(zip(*[
['8000', '8000', '8000', '8100', '8100', '8200'],
['2021-04-02', '2021-04-05', '2021-04-06', '2021-04-02', '2021-04-10', '2021-04-28']
]))
idx = pd.MultiIndex.from_tuples(tuples, names=['cardNumber', 'date_only'])
values = [4, 4, 2, 5, 1, 2]
df = pd.DataFrame(data=values, index=idx, columns=['Count'])
df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])])
我还有一个关于四月天的系列:
april_days = pd.date_range(start='2021-04-01', end='2021-04-30').to_series(index=None, name='Date')
在 df
中,不是每一天都会出现,所以我想将 april_days
与 df
合并,这样如果没有观察就会有一个空值。
我试过 merge
没有运气和 concat
where axis=1
但这也不起作用。如何合并这两个数据集?
答案 0 :(得分:1)
一种可能的解决方案是基于现有索引创建新索引并重新索引数据帧。请注意,对于此解决方案,我不会为 april_days 创建系列对象:
april_days = pd.date_range(start='2021-04-01', end='2021-04-30')
为了创建新索引,我在 april_dates 中为每个日期重复 cardNumber 索引:
idx_1 = df.index.levels[0].repeat(len(april_days))
之后,我创建了一个新的时间索引。因此,我重复了 april_days 3 次,因为有三个 cardNumber。请注意,这里您需要另一种方法来重复,否则 april_dates 将具有以下顺序 [01.04, 01.04, 01.04, 02.04,...]
。但是我们需要[01.04, 02.04, ..., 30.04, 01.04,...]
。因此,我使用以下方法:
import numpy as np
idx_time = np.array([april_days.values] * 3).flatten()
现在我可以创建新的多索引:
idx = list(zip(idx_1, idx_time))
并重新索引现有数据框:
df.reindex(idx)