Pandas按两列左连接数据帧

2024-09-28 16:57:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有两个数据帧。在

df1:

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

df2:

^{pr2}$

我需要在前两个基础上创建一个DataFrame,它有两个列的左连接。列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

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

提前致谢!在


Tags: 数据indexnandf1df2val1val2str1
3条回答

您可以尝试将join默认值为left)与rsuffix一起使用,以便df2的列名用后缀重命名。然后,使用np.where检查列值是否匹配,并为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)

结果:

^{pr2}$

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

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

输出:

^{pr2}$

如果'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

这是一种方法。如下所示,我建议您使用Boolean而不是float来表示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

相关问题 更多 >