【问题标题】:pandas merge and fill a dataframe with summary datapandas 合并并用汇总数据填充数据框
【发布时间】:2015-03-02 03:45:15
【问题描述】:

假设我有一个如下的数据框:

frameA = pandas.DataFrame(dict(title=['a','a','a','b','b','b'],value=[1,2,3,4,5,6]))
frameB = pd.DataFrame(dict(title=['a','b'],value=[10,20]))

frameA 看起来像

  title  value
0     a      1
1     a      2
2     a      3
3     b      4
4     b      5
5     b      6

frameB 看起来像

  title  value
0     a     10
1     b     20

我想进行某种合并或加入,以便获得

   title  value value2
    a      1      10
    a      2      10
    a      3      10
    b      4      20
    b      5      20
    b      6      20

我试过了 pd.concat([frameA,frameB],axis=1)frameA.merge(frameB)frameA.apply(lambda x: frameB[x.title])

这些都不起作用。我确信有一个非常明显的方法,但我现在似乎找不到它。谢谢

=========================================

在我发布这个之后我遇到了

Merging pandas dataframes using date as index 似乎显示了一种方式。还有其他的吗?

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    其他合并方式:

    frameA.merge(frameB,on ='title', how ='left')

      title  value_x  value_y
    0   a     1        10
    1   a     2        10
    2   a     3        10
    3   b     4        20
    4   b     5        20
    5   b     6        20
    

    【讨论】:

      【解决方案2】:

      你想要的是左连接。 http://pandas.pydata.org/pandas-docs/dev/merging.html

      pd.merge(frameA,frameB,on='title',how='left')
      

      输出:

        title  value_x  value_y
      0     a        1       10
      1     a        2       10
      2     a        3       10
      3     b        4       20
      4     b        5       20
      5     b        6       20
      

      【讨论】:

        【解决方案3】:

        不涉及重命名/删除列的更快方法是将 frameB 的索引设置为 title 并在 frameA 上调用 map 并传入另一个 df 并传递一个系列。这将使用标题值执行查找并返回匹配的值:

        In [85]:
        
        frameB.set_index('title', inplace=True)
        frameA['value2'] = frameA['title'].map(frameB['value'])
        frameA
        Out[85]:
          title  value  value2
        0     a      1      10
        1     a      2      10
        2     a      3      10
        3     b      4      20
        4     b      5      20
        5     b      6      20
        

        如果我们将合并的性能与 map 进行比较,我们可以看到 map 快了近 5 倍:

        In [70]:
        
        %timeit pd.merge(frameA,frameB,on='title',how='left')
        1000 loops, best of 3: 1.42 ms per loop
        In [83]:
        
        frameB.set_index('title', inplace=True)
        %timeit frameA['value2'] = frameA['title'].map(frameB['value'])
        1000 loops, best of 3: 286 µs per loop
        

        【讨论】:

          猜你喜欢
          • 2021-11-14
          • 1970-01-01
          • 2020-10-28
          • 1970-01-01
          • 2019-11-12
          • 2017-07-10
          • 2019-03-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多