pandas:合并(内连接)数据框的行数比原始行数多

Posted

技术标签:

【中文标题】pandas:合并(内连接)数据框的行数比原始行数多【英文标题】:pandas: merged (inner join) data frame has more rows than the original ones 【发布时间】:2017-05-25 14:47:58 【问题描述】:

我在 Jupyter Notebook 上使用 python 3.4,尝试合并两个数据框,如下所示:

df_A.shape
(204479, 2)

df_B.shape
(178, 3)

new_df = pd.merge(df_A, df_B,  how='inner', on='my_icon_number')
new_df.shape
(266788, 4)

我认为上面合并的new_df 的行数应该比df_A 少,因为合并就像一个内部连接。但是为什么new_df 这里的行数实际上比df_A 多?

这是我真正想要的:

我的df_A 是这样的:

 id           my_icon_number
-----------------------------
 A1             123             
 B1             234
 C1             123
 D1             235
 E1             235
 F1             400

而我的df_B 是这样的:

my_icon_number    color      size
-------------------------------------
  123              blue      small
  234              red       large 
  235              yellow    medium

那么我希望new_df 成为:

 id           my_icon_number     color       size
--------------------------------------------------
 A1             123              blue        small
 B1             234              red         large
 C1             123              blue        small
 D1             235              yellow      medium
 E1             235              yellow      medium

我真的不想删除 df_A 中 my_icon_number 的重复项。知道我在这里错过了什么吗?

【问题讨论】:

您在两个数据集中都有重复的my_icon_number @piRSquared:您能详细说明一下吗?谢谢! 您的简单插图不代表实际。很可能,您在 df_B 中重复了 my_icon_number。如果您认为这是 ba 之间的一对多连接,它实际上是多对多的,因此返回的记录更多。 【参考方案1】:

因为您在两个数据集中都有重复的合并列,您将获得具有该合并列值的 k * m 行,其中 k 是数据集 1 和 m 中具有该值的行数是数据集 2 中具有该值的行数。

试试drop_duplicates

dfa = df_A.drop_duplicates(subset=['my_icon_number'])
dfb = df_B.drop_duplicates(subset=['my_icon_number'])

new_df = pd.merge(dfa, dfb, how='inner', on='my_icon_number')

示例

在这个例子中,唯一的共同值是4,但我在每个数据集中都有 3 次。这意味着我应该在结果合并中得到 9 行,每个组合一个。

df_A = pd.DataFrame(dict(my_icon_number=[1, 2, 3, 4, 4, 4], other_column1=range(6)))
df_B = pd.DataFrame(dict(my_icon_number=[4, 4, 4, 5, 6, 7], other_column2=range(6)))

pd.merge(df_A, df_B,  how='inner', on='my_icon_number')

   my_icon_number  other_column1  other_column2
0               4              3              0
1               4              3              1
2               4              3              2
3               4              4              0
4               4              4              1
5               4              4              2
6               4              5              0
7               4              5              1
8               4              5              2

【讨论】:

谢谢!我在上面添加了一个示例来说明我的实际需要。我在这里使用内部连接做错了吗?谢谢! 我想我明白了。谢谢! @Edamame 那么你很好。您只需要接受这样一个事实,即您的结果最终可能会比您想象的更多,因为它代表了所有组合。 谢谢,在看到这个之前我已经开始怀疑自己的理智了

以上是关于pandas:合并(内连接)数据框的行数比原始行数多的主要内容,如果未能解决你的问题,请参考以下文章

使用左连接的查询返回的行数较少

Pyspark 的 sqlContext.read.csv() 函数读取的行数比实际 .csv 文件中的行数多

合并最近的追溯时间戳并在 pandas 中填充

如何获取 Pandas DataFrame 的行数?

如何获取 Pandas DataFrame 的行数?

如何获取 Pandas DataFrame 的行数?