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

kua*_*oka 6 python merge numpy duplicates pandas

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

df1.shape
(187399, 784)

df2.shape
(9790, 784)
Run Code Online (Sandbox Code Playgroud)

在之后pd.merge()的操作

common_cols = df1.columns.tolist()
df3 = pd.merge(df1, df2, on=common_cols, how="inner")
Run Code Online (Sandbox Code Playgroud)

我得到的结果比 df1 和 df2 都大

df3.shape
(283979, 784)
Run Code Online (Sandbox Code Playgroud)

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

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

piR*_*red 7

考虑两个数据框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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

df1.drop_duplicates(common_cols).merge(df2.drop_duplicates(common_cols))
Run Code Online (Sandbox Code Playgroud)


kua*_*oka 2

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

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