【问题标题】:How to merge DataFrame with Multi-Index如何将 DataFrame 与多索引合并
【发布时间】:2019-02-24 20:18:52
【问题描述】:

我想从我的DataFrame - df. 创建一个基于日期和时间的多索引 这实际上有效,indexed 返回正确的 Multiindex(连续日期从 2017 年 2 月 10 日到 2018 年 3 月 31 日,连续时间从 08:00:00 到 21:55:00,间隔 5 分钟)。

问题是我的数据集没有完整的观察结果。意味着,对于随机的一天,可能会丢失 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

【问题讨论】:

  • 似乎您可能需要考虑使用单个DatetimeIndex,它允许您使用resample 方法。或者干脆使用pd.date_range。至于合并,我没有看到任何与此相关的代码,所以很难知道出了什么问题。
  • 但我的猜测是合并问题与您的实际问题无关。您能否提供一些示例数据(可能就在pd.read_csv 行之后)和您的预期输出?
  • 嗨@ALollz,在 pd.read_csv 之后,我的初始索引是 DateTimeIndex。但是我必须对需要两个索引的数据应用一个公式。一个带日期,一个带时代...df 的输出完全没问题,我将其添加到我的帖子中。

标签: python pandas dataframe merge multi-index


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2021-01-11
    • 2018-03-25
    • 2021-01-10
    • 2017-11-27
    • 2021-05-16
    相关资源
    最近更新 更多