我有一个多索引数据帧:
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
和axis=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次,因为有三个卡号。注意,这里需要另一种方法来重复,因为否则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)