pandas merge(how="inner") 结果大于两个数据框

Posted

技术标签:

【中文标题】pandas merge(how="inner") 结果大于两个数据框【英文标题】:pandas merge(how="inner") result is bigger than both dataframes 【发布时间】:2017-09-09 16:55:03 【问题描述】:

我试图在两个具有相同列但行数不同的 pandas DataFrames 中找到重叠行:

df1.shape
(187399, 784)

df2.shape
(9790, 784)

pd.merge() 操作后

common_cols = df1.columns.tolist()
df3 = pd.merge(df1, df2, on=common_cols, how="inner")

我得到的结果大于 df1 和 df2

df3.shape
(283979, 784)

这怎么可能,我做错了什么? 我有两个 dfs,都有 784 列名为 [0,1,2,3...783] 并且每个 df 中的行数不同。我只想在这些 dfs 中找到相同行的交集。这意味着如果df1df2 中存在一行,则必须转到df3 在上一步中,我使用 pd.drop_duplicates() 删除了每个 df 中的重复项

在标题“问题 5”之后使用代码链接到 jupyter 笔记本 https://github.com/kuatroka/udacity_deep_learning/blob/master/1_notmnist-Copy1.ipynb

【问题讨论】:

如果在没有指定on=common_cols的情况下合并会发生什么? 检查您要合并的列的数据类型以确保它们完全相同 正在进行交叉连接 听起来您仍然有重复的键。你到底是怎么打电话给drop_duplicates()的? @ASGM - 结果与它相同。 @muon - 所有数据类型都是相同的。 @ajcr - 我从 numpy ndarray 创建了 pd.DataFrame 并通过 df1 = pd.DataFrame(numpy_ndarray1).drop_duplicates() 删除了重复项 【参考方案1】:

考虑df1df2这两个数据框

df1 = pd.DataFrame(dict(A=[1, 1, 1], B=[9, 8, 7]))
df2 = pd.DataFrame(dict(A=[1, 1, 1], C=[6, 5, 4]))


print(df1)
print()
print(df2)

   A  B
0  1  9
1  1  8
2  1  7

   A  C
0  1  6
1  1  5
2  1  4

如果我们在'A' 列上merge,它将为'A's 两列都等于1 的每个行组合返回一个数据框。

df1.merge(df2)

   A  B  C
0  1  9  6
1  1  9  5
2  1  9  4
3  1  8  6
4  1  8  5
5  1  8  4
6  1  7  6
7  1  7  5
8  1  7  4

回答 对于要合并的相同键,您在两个数据框中都有重复的行。

要解决这个问题,您可以(尽管您需要确定这是否适合您)

df1.drop_duplicates(common_cols).merge(df2.drop_duplicates(common_cols))

【讨论】:

我试过了。但是通过添加您的建议drop_duplicates(common_cols),我得到了相同的确切数字。问题是两个 dfs 中的所有列都是相同的。在您的示例中,df1 中有 A、B 和 df2 中有 A、C,但在我的情况下它们是相同的。此外,我在上一步中删除了重复项,我认为它有效,因为行数减少了。不过感谢您的尝试。 @kuatroka 理想情况下,您希望提供一个演示问题的最小示例。这样我们可以更快地解决问题。 感谢@piRSquared。这是 Jupyter Notebook 的链接,它是 Udacity 深度学习课程的一部分。我正在尝试解决“问题 5”。整个代码位于标题“问题 5”下方,但您还需要按照笔记本中的前面步骤进行操作。主要思想是在两个数据集中找到重叠的行,图像以二进制形式表示。我看到有些人通过散列找到了一种方法,但我确信 numpy 和 pandas 应该有一个更简单的方法。链接link【参考方案2】:

我想发布我自己问题的解决方案,但它完全是技术性的,而不是功能性的,因此@piRSquared 是完全正确的。

结果是一个非常奇怪的问题。在我的 conda 安装中,我安装了 Intel MKL 模块,默认情况下它是打开的。这个模块据说可以提高 numpy、scipy 和 scikit-learn 的速度。一旦我使用 CLI 命令 conda install nomkl 禁用它,我就从我的第一个代码中得到了正确的结果。我正在为 MKL 添加新标签,以防其他人遇到这种奇怪的 numpy.merge() 行为 谢谢大家。

【讨论】:

以上是关于pandas merge(how="inner") 结果大于两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

Python, pandas: how to sort dataframe by index// Merge two dataframes by index

python数据表的合并(python pandas join() merge()和concat()的用法)

第十四节:pandas之merge()合并

python pandas.merge() 函数 解析

Pandas的Merge实现

详解pandas库的pd.merge函数