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 中找到相同行的交集。这意味着如果df1
和df2
中存在一行,则必须转到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】:
考虑df1
和df2
这两个数据框
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