熊猫数据框中的内部连接/合并比左数据框提供更多的行

Posted

技术标签:

【中文标题】熊猫数据框中的内部连接/合并比左数据框提供更多的行【英文标题】:inner join/merge in pandas dataframe give more rows than left dataframe 【发布时间】:2017-12-28 22:48:11 【问题描述】:

以下是数据框列的外观。

df1='设备号', '日期', ....> 3500 条记录

df2='device number', 'date', ....> 14,000 条记录

在每个数据帧中,“设备号”和“日期”都不是唯一的。但是,它们的组合是唯一标识一行的。

我正在尝试形成一个新的数据框,该数据框与 df1 和 df2 中的行匹配,其中设备号和日期都相等,并且具有这些 df1 和 df2 中的所有列。我正在尝试的 pandas 命令是

df3=pd.merge(df1, df2, how='inner', on=['device number', 'date'])

但是,df3 给了我一个形状为 (14,000, 21) 的数据框。列号是有道理的,但是内部连接的行数怎么能比任何左边的数据框都多呢?这是否意味着我对内部连接的理解存在缺陷?另外,我怎样才能达到我描述的结果?

【问题讨论】:

如果您可以发布一个验证您的声明的代码,那就太好了——例如组合是独一无二的。如果两个数据帧都包含唯一键,则结果将为 (3,500, 21)。 @SanghackLee 谢谢,我对 python 很熟悉。独特性来自我对数据源和领域知识的了解。但是知道如何从代码中验证它吗?我想到了 DataFrame.duplicated 函数,但不知道如何使它在两个字段的组合上起作用。 也许 ... print(len(set(zip(df1['device number'], df1['date'])))) 和 df2。 (其他方法见here 【参考方案1】:

只有这样我才能看到这种情况发生...尤其是 14,000 与 df2 中的记录数相同的确切数字是 df2 中的列组合是否唯一.

您可以通过以下方式验证它们不是唯一的(True 如果唯一)

df2.duplicated(['device number', 'date']).sum() == 0

或者

df.set_index(['device number', 'date']).index.is_unique

【讨论】:

非常感谢,这让我头疼了两天,这个答案很完美!

以上是关于熊猫数据框中的内部连接/合并比左数据框提供更多的行的主要内容,如果未能解决你的问题,请参考以下文章

熊猫与“左”选项合并正在丢失左侧数据框中的行

比较熊猫数据框中的行值

熊猫应用函数将多个值返回到熊猫数据框中的行

比较熊猫数据框中的行值

从另一个数据框中删除包含相同日期的行-python-大熊猫

熊猫数据框中的行排序和聚合