【问题标题】:Merge DataFrame with multi index columns将 DataFrame 与多索引列合并
【发布时间】:2019-03-16 10:05:08
【问题描述】:

我从不同来源的数据帧中下载了数据,并希望将它们合并到一个最终数据帧中。让我们用下面的例子来说明它:

数据框 1(已经多索引列)

index    stockA        stockB      ...
        O  L  H  C    O  L  H  C
1/1/19  10 15 20 17  35 30 39 37
2/1/19  ...          ...
...

数据框 2(非多索引列)

index    stockA  stockB     
1/1/19    1.5     3.2 
2/1/19    ...     ...
...

我想合并数据框并为 dataframe2 中的数据提供列名。两个数据框中的索引日期可能不一样,所以我可能需要进行内部合并。

预期输出(多索引列)

index    stockA                 stockB             ...
        O  L  H  C new_col    O  L  H  C  new_col
1/1/19  10 15 20 17 1.5       35 30 39 37  3.2
2/1/19       ...                     ...
...

【问题讨论】:

  • 您可以为1)2) 添加预期输出吗?为什么需要带有样本数据的inner merge?也许有必要将数据更改为minimal, complete, and verifiable example,尤其是2)
  • 嗨,我删除了2),因为我想通了。我需要inner merge,因为数据框之间的日期可能不匹配。但是我可以通过使用数据框之间的相交日期重新分割新的数据框来克服这个问题。

标签: python pandas dataframe


【解决方案1】:

用途:

print (df1)
       stockA             stockB            
            O   L   H   C      O   L   H   C
1/1/19     10  15  20  17     35  30  39  37
2/1/19     12  13  26  27     31  50  29  17

print (df2)
        stockA  stockB
2/1/19     1.5     3.2
3/1/19     1.2     6.2

如有必要,将index 中的索引转换为datetimes:

df1.index = pd.to_datetime(df1.index, format='%d/%m/%y')
df2.index = pd.to_datetime(df2.index, format='%d/%m/%y')

通过Index.intersection在两个索引中获取相同的值:

idx = df1.index.intersection(df2.index)
print (idx)
DatetimeIndex(['2019-01-02'], dtype='datetime64[ns]', freq=None)

MultiIndex.from_productdf2 中创建MultiIndex

df2.columns = pd.MultiIndex.from_product([df2.columns, ['new']])
print (df2)
           stockA stockB
              new    new
2019-01-02    1.5    3.2
2019-01-03    1.2    6.2

通过DataFrame.loc过滤两个DataFrame,通过DataFrame.join连接在一起,最后通过DataFrame.sort_indexMultiIndex进行排序:

df = df1.loc[idx].join(df2.loc[idx]).sort_index(level=0, axis=1)
print (df)
           stockA                  stockB                 
                C   H   L   O  new      C   H   L   O  new
2019-01-02     27  26  13  12  1.5     17  29  50  31  3.2

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2018-03-25
    • 2021-09-01
    • 2016-11-22
    • 2021-01-11
    • 1970-01-01
    • 2020-10-31
    • 2018-04-08
    相关资源
    最近更新 更多