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
假设我有一个数据框如下:
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