当前位置: 首页 > 知识库问答 >
问题:

熊猫左外联接导致表大于左表

张权
2023-03-14

根据我对左向外连接的理解,结果表的行永远不会比左表多...请让我知道如果这是错的...

我的左表是192572行8列。

我右边的表格是42160行和5列。

我的左表有一个名为“id”的字段,它与我的右表中名为“key”的列相匹配。

因此,我将它们合并为:

combined = pd.merge(a,b,how='left',left_on='id',right_on='key')

但是然后组合的形状是236569。

我有什么误会?

共有3个答案

满博
2023-03-14

对给定答案的一个小补充是,有一个名为validate的参数,如果右表中有匹配的重复ID,该参数可用于引发错误:

combined = pd.merge(a,b,how='left',left_on='id',right_on='key', validate = 'm:1')
桂志诚
2023-03-14

还有一些策略可以用来避免这种行为,这些策略不涉及丢失重复的数据,例如,如果不是所有的列都重复的话。如果你有的话

In [1]: df = pd.DataFrame([[1, 3], [2, 4]], columns=['A', 'B'])

In [2]: df2 = pd.DataFrame([[1, 5], [1, 6]], columns=['A', 'C'])

一种方法是取副本的平均值(也可以取总和等)

In [3]: df3 = df2.groupby('A').mean().reset_index()

In [4]: df3
Out[4]: 
     C
A     
1  5.5

In [5]: merged = pd.merge(df,df3,on=['A'], how='outer')

In [6]: merged
Out[204]: 
   A  B    C
0  1  3  5.5
1  2  4  NaN

或者,如果有不能使用_numeric()pd.to转换的非数字数据,或者如果您只是不想取平均值,您可以通过枚举重复来更改合并变量。然而,当两个数据集中都存在重复数据时(这将导致相同的问题行为,也是一个常见问题),此策略将适用:

In [7]: df = pd.DataFrame([['a', 3], ['b', 4],['b',0]], columns=['A', 'B'])

In [8]: df2 = pd.DataFrame([['a', 3], ['b', 8],['b',5]], columns=['A', 'C'])

In [9]: df['count'] = df.groupby('A')['B'].cumcount()

In [10]: df['A'] = np.where(df['count']>0,df['A']+df['count'].astype(str),df['A'].astype(str))

In[11]: df
Out[11]: 
    A  B  count
0   a  3      0
1   b  4      0
2  b1  0      1

对df2执行相同操作,删除df和df2中的计数变量,并在“A”上合并:

In [16]: merged
Out[16]: 
    A  B  C
0   a  3  3        
1   b  4  8        
2  b1  0  5        

几个音符。在最后一种情况下,我使用. cumcount()而不是。重复的,因为对于给定的观察,可能有多个重复。此外,我使用. astype(str)将计数值转换为字符串,因为我使用np.where()命令,但使用pd.concat()或其他东西可能会允许不同的应用程序。

最后,如果只有一个数据集具有重复项,但您仍然希望保留它们,那么您可以使用后一种策略的前半部分在结果合并中区分重复项。

柴高岑
2023-03-14

如果键与另一个数据帧中的多行匹配,则可以预期这会增加:

In [11]: df = pd.DataFrame([[1, 3], [2, 4]], columns=['A', 'B'])

In [12]: df2 = pd.DataFrame([[1, 5], [1, 6]], columns=['A', 'C'])

In [13]: df.merge(df2, how='left')  # merges on columns A
Out[13]: 
   A  B   C
0  1  3   5
1  1  3   6
2  2  4 NaN

要避免这种行为,请在df2中删除重复项:

In [21]: df2.drop_duplicates(subset=['A'])  # you can use take_last=True
Out[21]: 
   A  C
0  1  5

In [22]: df.merge(df2.drop_duplicates(subset=['A']), how='left')
Out[22]: 
   A  B   C
0  1  3   5
1  2  4 NaN
 类似资料:
  • 问题内容: 根据我对左外部联接的了解,结果表的行数永远不应超过左表的行数…如果这是错误的,请让我知道… 我的左表是192572行和8列。 我的右边表格是42160行和5列。 我的左表有一个名为“ id”的字段,该字段与我的右表中名为“键”的一列匹配。 因此,我将它们合并为: 但是组合的形状是236569。 我有什么误会? 问题答案: 如果键与另一个DataFrame中的多个行匹配,则可以预期这种情

  • 我有一个表,需要离开外部连接两个不同的表。当我将表放入查询中两次,并将其与where子句中的self连接时(如下面的句子),它就可以工作了。我认为这不应该是正确的做法。如何编写select语句并将表与多个不同的表进行外部联接?

  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那

  • 有人能让我知道我在里面做错了什么吗?我怎样才能让它工作?

  • 问题内容: 这个问题已经在这里有了答案 : SQL中左右联结与左右联结之间的区别[重复] (4个答案) 6年前关闭。 我看到过称为LEFT OUTER JOIN或RIGHT OUTER JOIN的联接。在某些地方,我见过LEFT JOIN或RIGHT JOIN。我对此感到困惑。 我两天前发布了一个问题,但我无法理解解决方案提供的链接。 这些连接类型是否相同,或者两者之间有区别? 问题答案: 两者之

  • 问题内容: 我正在尝试使用以下查询获取每天打开的页面数。 我得到的输出是这样的: 问题是,在我的日表中,我有一列包含数字1到30来代表一个月中的日子。我进行了左外部连接,希望在天数列中显示所有天数! 但是我的查询正在这样做,为什么会这样呢? 谢谢大家的帮助。 问题答案: Nanne给出的答案解释了为什么您没有得到期望的结果(您的WHERE子句删除了行),但是却没有解决方法。 解决方案是将WHERE