【问题标题】:Merging dataframes by using 2 identifiers使用 2 个标识符合并数据帧
【发布时间】:2018-12-01 06:38:23
【问题描述】:

我有 2 个数据框,我想将第 2 个数据框的数据添加到第一个数据框,以便获得下面的第 3 个数据框:

第一个数据帧:

 dict = [{'name': 'aapl', 'date': '2016-11-29'},
 {'name': 'msft', 'date': '2016-11-29'},
 {'name': 'ge', 'date': '2016-11-29'},
 {'name': 'jpm', 'date': '2016-11-29'},
 {'name': 'aapl', 'date': '2016-11-30'},
 {'name': 'msft', 'date': '2016-11-30'},
 {'name': 'ge', 'date': '2016-11-30'},
 {'name': 'jpm', 'date': '2016-11-30'}]
 df1 = pd.DataFrame(dict)

第二个数据框:

 dict = [{'2016-11-29': 'x1', '2016-11-30': 'y1'},
 {'2016-11-29': 'x2','2016-11-30': 'y2'},
 {'2016-11-29': 'x3','2016-11-30': 'y3'},
 {'2016-11-29': 'x4','2016-11-30': 'y4'}]
 df2 = pd.DataFrame(dict, index=['aapl', 'msft','ge','jpm'])

第三个数据框(目标):

dict = [{'name': 'aapl', 'date': '2016-11-29', 'df2': 'x1'},
 {'name': 'msft', 'date': '2016-11-29', 'df2': 'x2'},
 {'name': 'ge', 'date': '2016-11-29', 'df2': 'x3'},
 {'name': 'jpm', 'date': '2016-11-29', 'df2': 'x4'},
 {'name': 'aapl', 'date': '2016-11-30', 'df2': 'y1'},
 {'name': 'msft', 'date': '2016-11-30', 'df2': 'y2'},
 {'name': 'ge', 'date': '2016-11-30', 'df2': 'y3'},
 {'name': 'jpm', 'date': '2016-11-30', 'df2': 'y4'}]
 df3 = pd.DataFrame(dict)

有没有简单的方法来做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    merge之前使用melt

    newdf2=df2.reset_index().melt('index').rename(columns={'index':'name','variable':'date'})
    
    df3=df1.merge(newdf2,how='left')
    df3
             date  name value
    0  2016-11-29  aapl    x1
    1  2016-11-29  msft    x2
    2  2016-11-29    ge    x3
    3  2016-11-29   jpm    x4
    4  2016-11-30  aapl    y1
    5  2016-11-30  msft    y2
    6  2016-11-30    ge    y3
    7  2016-11-30   jpm    y4
    

    【讨论】:

    • 太棒了!!非常感谢!!
    • @Tartaglia yw :-)
    【解决方案2】:
    new_df = df1.merge(df2.unstack().to_frame('df2'), left_on=['date','name'], right_index=True)
    
    >>>new_df
             date  name df2
    0  2016-11-29  aapl  x1
    1  2016-11-29  msft  x2
    2  2016-11-29    ge  x3
    3  2016-11-29   jpm  x4
    4  2016-11-30  aapl  y1
    5  2016-11-30  msft  y2
    6  2016-11-30    ge  y3
    7  2016-11-30   jpm  y4
    

    这很有效,因为当您取消堆栈 df2:

    df2.unstack().to_frame('df2')
                    df2
    2016-11-29 aapl  x1
               msft  x2
               ge    x3
               jpm   x4
    2016-11-30 aapl  y1
               msft  y2
               ge    y3
               jpm   y4
    

    索引可在df1datename 列上合并

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2022-01-07
      • 1970-01-01
      • 2017-04-23
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多