pandas 合并并用摘要数据填充数据框

pandas merge and fill a dataframe with summary data

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

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])

None 其中工作。我敢肯定有一个非常明显的方法,但我现在似乎找不到它。谢谢

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

在我发布这篇文章后,我发现了

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

你想要的是左连接。 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

其他合并方式:

frameA.merge(frameB,on ='title',如何='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

一种不涉及 renaming/dropping 列的更快的方法是将 frameB 的索引设置为 title 并在 frameA 上调用 map 传递另一个 df 并传递一个系列.这将使用标题值和 return 匹配的值执行查找:

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