我有两个数据帧D1和D2。两者都有不同的大小,但有一定的关系。 D1有一列" ID"具有相同ID的多个实例,而D2只有一个实例。那么如何将这两个数据帧连接在一起呢?
D1: D2:
ID val1 val2 ID Target
1 x y 1 0
1 x y 2 1
2 a b
2 a c
所以这里我需要在D1中有一个新列,称为D1中每一行的目标,其中相应的值来自D2
ID val1 val2 Target
1 x y 0
1 x y 0
2 a b 1
2 a c 1
答案 0 :(得分:3)
您想离开merge
:
In [36]:
D1.merge(D2, on='ID', how='left')
Out[36]:
ID val1 val2 Target
0 1 x y 0
1 1 x y 0
2 2 a b 1
3 2 a c 1
这匹配公共列'ID',左合并类似于SQL样式合并
答案 1 :(得分:2)
选项1:join
此解决方案要求您设置D2
的索引并使用on
参数
D1.join(D2.set_index('ID'), on='ID')
ID val1 val2 Target
0 1 x y 0
1 1 x y 0
2 2 a b 1
3 2 a c 1
注意:如果D2
未包含D1.ID
中的所有值,并且您想要D1
行的空值,那么是,然后使用how='left'
选项。
D1.join(D2.set_index('ID'), on='ID', how='left')
来自评论的:
为什么这需要设置D2的索引?其他答案不会这样做。 - ErikE
@ErikE这是合并和加入之间的区别。 pandas.DataFrame.merge默认会对列值执行合并。虽然join默认情况下会查看索引。我可以通过使用on =' ID'指定要加入的列来覆盖联接行为。但是,该覆盖能力仅限于左对象。因此,我必须设置正确对象的索引才能正确执行。 - piRSquared
选项2:map
+ assign
此解决方案将D2
转换为dict
,例如pd.Series
,索引为'ID'
,值为'Target'
。 map
会将'ID'
上的D1
列转换为新值,然后我们将其分配到assign
的新列。
D1.assign(Target=D1.ID.map(D2.set_index('ID').Target))
ID val1 val2 Target
0 1 x y 0
1 1 x y 0
2 2 a b 1
3 2 a c 1
答案 2 :(得分:0)
D1.merge(D2, how='left', on="ID")
这相当于SQL左连接。这意味着保留D1的每个值,并且将添加与D2的ID匹配的任何值。