Pandas:连接时'on'失败

1 投票
1 回答
1005 浏览
提问于 2025-04-18 02:01

我有两个数据表,df1:

        ID     value 1
0      5      162
1      7      185
2      11     156

还有 df2:

        ID     Comment
1      5      
2      7      Yes!
6      11

我想用 ID 把它们合并在一起,结果应该像这样:

ID     value 1     Comment
5      162
7      185         Yes!
11     156

实际上,这两个数据表都要大得多,还包含更多的列。我主要是想把 df2 中的 Comment 列加到 df1 中。我试过用

df1 = df1.join(df2['Comment'], on='ID')

... 但是这样只在 df1 中得到了一个新的空的 Comment 列,感觉 .join 没有把 ID 列当作索引来用。我也试过

df1 = df1.join(df2['Comment'])

... 但是那样用的是默认的索引,而这两个数据表的索引不匹配(它们的长度也不同),导致 Comment 的值放错了地方。

我到底哪里做错了呢?

1 个回答

3

你可以通过合并来实现你想要的效果:

In [30]:

df1.merge(df2, on='ID')
Out[30]:
   ID  value1 Comment
0   5     162    None
1   7     185    Yes!
2  11     156    None

[3 rows x 3 columns]

使用join的一个问题是,它默认是进行左侧索引合并。如果你的数据框没有匹配的公共索引值,那么你的评论列就会变成空的。

编辑

根据评论,如果你想保留df1中的所有值,并且只添加那些不为空且在df1中存在的ID的评论,那么你可以进行一个left合并:

df1.merge(df2.dropna( subset=['Comment']), on='ID', how='left')

这样会删除任何空评论的行,使用ID列来合并df1df2,并且执行一个left合并,这样可以保留左侧的所有值,同时合并那些在ID列中匹配的评论。默认情况下是inner合并,这样只保留在左右两个数据框中都有的ID

更多关于merge的信息和更多示例

撰写回答