【问题标题】:Merging dataframes with hierarchcial index?将数据框与分层索引合并?
【发布时间】:2020-09-27 21:41:32
【问题描述】:

问题

  • 如何使用分层索引合并两个数据帧?
  • 我的数据帧的索引是datetime.datetimedatetime.time

代码示例

import pandas as pd
import numpy as np
import datetime

BTC_df = pd.DataFrame(np.array([[datetime.time(19,15,0),1.05,'BTC'],[datetime.time(9,20,0),1.2,'BTC']]),
                      columns = ['time','return','coin'],
                      index = [[datetime.date(2020,5,1), datetime.date(2020,5,2)]])

ETH_df = pd.DataFrame(np.array([[datetime.time(8,30,0),1.1,'ETH'],[datetime.time(17,30,0),0.9,'ETH']]),
                      columns = ['time','return','coin'],
                      index = [[datetime.date(2020,5,1), datetime.date(2020,5,2)]])

BTC_df 
>>>               time    return   coin
   2020-05-01   19:15:00    1.05    BTC
   2020-05-02   09:20:00    1.2     BTC

ETH_df 
>>>                time    return   coin
   2020-05-01   08:30:00    1.1     ETH
   2020-05-02   17:30:00    0.9     ETH

我想要的输出如下,使用分层索引(MultiIndex)

merged_df
>>>               time    return   coin
   2020-05-01   08:30:00    1.1     ETH
                19:15:00    1.05    BTC
   2020-05-02   09:20:00    1.2     BTC
                17:30:00    0.9     ETH

【问题讨论】:

    标签: python pandas dataframe merge concatenation


    【解决方案1】:

    您可以使用pd.concat 并使用df.sort_values 对其进行排序。

    df = pd.concat([BTC_df,ETH_df])
    df.rename_axis('Date').sort_values(by=['Date','time'])
    
                    time return coin
    Date
    2020-05-01  08:30:00    1.1  ETH
    2020-05-01  19:15:00   1.05  BTC
    2020-05-02  09:20:00    1.2  BTC
    2020-05-02  17:30:00    0.9  ETH
    

    【讨论】:

    • 我们可以在这里做多级索引以摆脱重复的日期吗?例如,我只想看到一个2020-05-01,而不是看到两次。
    • @Eiffelbear 但是为此,您也将'time' 作为索引。然后你会得到MultiIndex。见 Quang 的回答。
    【解决方案2】:

    您可以使用set_indexappend 来制作time

    pd.concat([BTC_df,ETH_df]).set_index('time',append=True).sort_index()
    

    输出:

                        return coin
               time                
    2020-05-01 08:30:00    1.1  ETH
               19:15:00   1.05  BTC
    2020-05-02 09:20:00    1.2  BTC
               17:30:00    0.9  ETH
    

    【讨论】:

      【解决方案3】:
      pd.concat([BTC_df,ETH_df]).sort_values(by='time', ascending=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-24
        • 2016-08-01
        • 2012-12-18
        • 2013-04-06
        • 2023-04-09
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        相关资源
        最近更新 更多