Pandas Left Merge / Join not得不到左连接的预期

时间:2015-09-21 11:55:25

标签: python join pandas merge

所以我可能根本不知道左边的连接是什么,因为我被绊倒了...这是我对左连接的定义:

  

包括左表和右表中的匹配记录以及输出表中LEFT表的不匹配记录。

以下是我的例子:

In[87]: df1 = DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'], 'data1': range(6)})

In[88]: df2 = DataFrame({'key': ['a', 'b', 'a', 'b', 'd'], 'data2': range(5)})

In[89]: pd.merge(df1, df2, on='key', how='left')

Out[86]: 
    data1 key  data2
0       0   b      1
1       0   b      3
2       1   b      1
3       1   b      3
4       2   a      0
5       2   a      2
6       3   c    NaN
7       4   a      0
8       4   a      2
9       5   b      1
10      5   b      3

无论其!!!我希望得到这个:

    data1 key  data2
0       0   b      1
1       1   b      1
2       2   a      0
3       3   c      NaN
4       4   a      0
5       5   b      1

我的一般思考来自交易数据(例如我可能正在合并标题和项目详细信息或合并查找数据的会计凭证)。

我的想法或代码中缺少什么才能使其发挥作用?

PS - 这来自Wes McKinney的Python for Data Analysis一书(第179页) - 他提到了以下内容:

  

多对多合并具有明确定义但不一定是直观的行为。多对多连接形成行的笛卡尔积。由于左侧DataFrame中有3个“b”行,右侧有2个,因此结果中有6个“b”行。

我想我错过了这一点?

1 个答案:

答案 0 :(得分:2)

获得预期输出的方法是按data1分组并获取每组的第一个值:

g = df.groupby('data1').first().reset_index()

返回:

   data1 key  data2
0      0   b      1
1      1   b      1
2      2   a      0
3      3   c    NaN
4      4   a      0
5      5   b      1

希望有所帮助。