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

熊猫左键通过两列连接数据帧

益银龙
2023-03-14

你能帮我连接两个数据帧吗。

我有两个数据帧。

DF1:

index   val1    val2
--------------------
1       str1    abc1
2       str2    abc2
3       str3    abc3
4       str4    abc9
5       str5    abc4

DF2:

index   val2
------------
1       abc1
2       abc2
4       abc3 
5       abc4
9       abc5

我需要基于前两个数据帧创建一个数据帧,左连接两列。列index和val2在两个数据帧中具有相同的名称。df3的结果应该如下所示:

index   val1    val2    val3
----------------------------
1       str1    abc1    1
2       str2    abc2    1
3       str3    abc3    NaN
4       str4    abc9    NaN
5       str5    abc4    1

应该删除df1中不存在的df2中的索引,如果df1中的索引具有与df2中相同的val2,则应该将1添加到新的列val3中,否则:NaN。

非常感谢提前!

共有3个答案

伯向晨
2023-03-14

由于您希望在索引和列的组合上进行合并,因此可以将它们全部添加到索引中,或者在合并之前reset_index。我们还将val3列分配给df2,以便合并它。

(df1.reset_index().merge(
     df2.reset_index().assign(val3 = 1), on=['index', 'val2'], how='left')
    .set_index('index'))

输出:

       val1  val2  val3
index                  
1      str1  abc1   1.0
2      str2  abc2   1.0
3      str3  abc3   NaN
4      str4  abc9   NaN
5      str5  abc4   1.0

如果'index'只是一列而不是索引,那么只需指定两个要合并的键即可。

df1.merge(df2.assign(val3 = 1), on=['index', 'val2'], how='left')

输出:

   index  val1  val2  val3
0      1  str1  abc1   1.0
1      2  str2  abc2   1.0
2      3  str3  abc3   NaN
3      4  str4  abc9   NaN
4      5  str5  abc4   1.0
强宾白
2023-03-14

您可以尝试将join(默认值为左)与rsuffix一起使用,以便使用后缀重命名df2的列名。然后,使用np。其中检查列值是否匹配,并为val3列赋值。

import numpy as np

df = df1.join(df2, rsuffix='_df2')
df['val3'] = np.where(df.val2 == df.val2_df2, 1, np.NaN)
del df['val2_df2']
print(df)

结果:

       val1  val2  val3
index                  
1      str1  abc1   1.0
2      str2  abc2   1.0
3      str3  abc3   NaN
4      str4  abc9   NaN
5      str5  abc4   1.0
邓仲卿
2023-03-14

这是一个办法。如下所示,我建议您对val3使用布尔值而不是浮动,因为这就是这个系列所代表的。

# merge and set index
res = df1.merge(df2, how='left').set_index('index')

# map val2 from df2
res['val3'] = df2.set_index('index')['val2']

# check for equality of val3 and val2
res['val3'] = res['val3'] == res['val2']

print(res)

       val1  val2   val3
index                   
1      str1  abc1   True
2      str2  abc2   True
3      str3  abc3  False
4      str4  abc9  False
5      str5  abc4   True
 类似资料:
  • 问题内容: 我有两个具有以下列名称的数据框: 我想通过加入(左)on获得以下列的数据框: 如果我要连接的列不是索引,我无法弄清楚该怎么做。最简单的方法是什么?谢谢! 问题答案: 您可以按以下方式使用left_on和right_on选项: 从问题中我不能确定您是否只想合并密钥是否位于左侧数据框中。如果是这种情况,则以下将执行此操作(以上内容实际上会进行多对多合并)

  • 我有两个非常大的系列,只包含连接键。在不使用索引的情况下(在本例中没有意义),我希望以最有效的方式通过值将一个系列左键连接到另一个系列。 现在,我添加了一列1,这样我就可以使用和一个左连接,这样我就可以确定中的每个键是否也存在于Right中。 我确信我可以在不创建两个未使用的列的情况下完成这项工作,但是似乎希望为联接使用索引。有没有办法让两个系列的值保持不变?有没有更快的numpy版本? 例如:

  • 问题内容: 我找不到关于交叉联接的任何信息,包括合并/联接或其他一些东西。我需要使用{my function}作为myfunc处理两个数据帧。相当于: 相当于: 但我需要更有效的解决方案:如果使用了应用,我将如何实现它们; ^^ 问题答案: 对于叉积,请参阅此问题。 本质上,您必须进行常规合并,但为每一行赋予相同的键以进行连接,以使每一行在框架之间相互连接。 然后可以通过应用函数将列添加到新框架:

  • 我需要将两个数据帧和一个接一个地连接起来,它们具有相同的行数(),而不考虑任何键。此函数类似于

  • 我有一个csv文件列表,我使用 我目前正在尝试遍历csv列表,并使用方法将axis参数设置为1,以按列将所有数据帧添加到一起。 它是工作的希望,但我遇到的问题,因为所有的数据帧都有相同的冒号名称,当我连接他们我得到例如10列都与关键"日期" 不管怎样,我能给哥伦布起个独一无二的名字吗?比如伦敦约会,柏林约会?显然,这些名称基于数据帧的名称。

  • 问题内容: 我有一个熊猫数据框列表,我想将其合并为一个熊猫数据框。我正在使用Python 2.7.10和Pandas 0.16.2 我从以下位置创建了数据框列表: 这将返回数据帧列表 这是一些样本数据 我想将,和组合成一个熊猫数据框。另外,使用该选项时将大表直接读入数据框的方法将非常有帮助。 问题答案: 鉴于所有数据框都具有相同的列,您可以简单地将它们: