如何将DataFrame与多索引合并

时间:2018-09-20 13:39:41

标签: python pandas dataframe merge multi-index

我想根据我的DataFrame - df. 中的日期和时间创建一个多索引 这实际上有效,indexed返回正确的Multiindex(连续的日期,从02/10/2017到31/03/2018,连续的时间从08:00:00-21:55:00,以5分钟为间隔)。< / p>

问题在于我的数据集没有完整的观测值。意思是,对于随机的一天,可能会缺少08:05:00至08:40:00的观测值。我的Multiindex的长度为20496,而我的DataFrame的长度为20486。

当我想将索引与我的DataFrame合并时,所有观察值都是NAN。现在有人可以将多重索引与我的初始DataFrame - df合并吗?

df = pd.read_csv(file_name, parse_dates=[0], 
index_col=0, sep=',')
df['Date'] = df.index.date
df['Time'] = df.index.time
df['Time'] = df['Time'].astype(str)
df = df[df['Time'] != '22:00:00']

list_date = set(df['Date'])
list_time = set(df['Time'])

list_date = sorted(list_date)
list_time = sorted(list_time)

iterables = [list_date, list_time]
indexed = pd.MultiIndex.from_product(iterables, 
names=['date', 'time'])
df_new = pd.DataFrame(df, index=indexed)

df输出:

                            r2     var_v2x        Date      Time
TIME1                                                            
2017-10-02 08:00:00         NaN  0.00008784  2017-10-02  08:00:00
2017-10-02 08:05:00  0.00000000  0.00008784  2017-10-02  08:05:00
2017-10-02 08:10:00  0.00000008  0.00008784  2017-10-02  08:10:00

1 个答案:

答案 0 :(得分:0)

找到了一个解决方案(可能不是一个优雅的解决方案)。

df = pd.read_csv(file_name, parse_dates=[0], index_col=0, sep=',')
df['Date'] = df.index.date
df['Time'] = df.index.time
df['Time'] = df['Time'].astype(str)

df = df[df['Time'] != '22:00:00']

list_date = set(df['Date'])
list_time = set(df['Time'])

list_date = sorted(list_date)
list_time = sorted(list_time)

iterables = [list_date, list_time]
indexed = pd.MultiIndex.from_product(iterables, names=['date', 'time'])

df_index_date = indexed.get_level_values(0)
df_index_time = indexed.get_level_values(1)

df_joined = pd.DataFrame(df_index_date.astype(str) + ' ' + df_index_time.astype(str))
df_joined = df_joined.reset_index()
df_joined = df_joined.set_index(df_joined[0])
del df_joined['index']
del df_joined[0]

df_final = df_joined.join(df)
df_final = df_final.reset_index(drop=True)
df_final = df_final.set_index(indexed)