Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 左合并/合并不会产生左合并的预期结果_Python_Join_Pandas_Merge - Fatal编程技术网

Python 左合并/合并不会产生左合并的预期结果

Python 左合并/合并不会产生左合并的预期结果,python,join,pandas,merge,Python,Join,Pandas,Merge,所以我可能只是不太了解什么是左连接,因为我被绊倒了。。。以下是我对左连接的定义: 在输出表中包括左表和右表中的匹配记录以及左表中的不匹配记录 以下是我的例子: 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

所以我可能只是不太了解什么是左连接,因为我被绊倒了。。。以下是我对左连接的定义:

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

以下是我的例子:

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页)得出的,他在书中提到了以下内容:

多对多合并具有定义良好但不一定直观的行为。多对多连接形成行的笛卡尔乘积。由于左数据框中有3个“b”行,右数据框中有2个,因此结果中有6个“b”行


我想我没有抓住要点?

获得预期输出的一种方法是按
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

希望这能有所帮助。

我不理解您的预期输出。第一个数据帧中的第一个
b
与第二个数据帧中位置1处的
b
和位置3处的
b
相匹配。当进行左连接时,为什么只希望第一个配对,而不希望第二个配对?来自我对一个行业产品的经验。我对此的定义是“多对一联接只将主键值匹配到匹配的次键值的第一个匹配项”。如果存在其他匹配的辅助关键字值,它们将被忽略。“我喜欢左表(主表)保持不变,只为匹配项引入值的想法(但结果中仍保留有不匹配的主表,因为它是不匹配的)。这需要先计算完整的左联接。如果速度很关键,这可能不是最佳解决方案。