python - Pandas :加入 'on' 失败

标签 python pandas

我有两个 DataFrame,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

真正的 DataFrame 更大并且包含更多列,我本质上想将 Comment 列从 df2 添加到 df1。我尝试使用

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

...但这只会让我在 df1 中获得一个新的空 Comment 列,就像 .join 不知何故无法使用 ID 列作为索引。我也尝试过

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

...但是它使用默认索引,两个 DataFrame 之间不匹配(它们也有不同的长度),从而在错误的位置给了我一个 Comment 值。

我做错了什么?

最佳答案

您只需进行合并即可实现您想要的:

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 的问题是默认情况下它执行左索引连接,因为您的数据帧没有匹配的公共(public)索引值,那么您的评论列最终为空

编辑

根据注释,如果您想保留 df1 中的所有值并仅添加非空且具有 df1 中存在的 ID 的注释,那么您可以可以执行合并:

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

这将删除任何带有空注释的行,使用 ID 列将 df1df2 合并,但执行 left 合并,以便保留左侧的所有值,但会合并与 ID 列匹配的注释,默认为 inner ,保留左侧的 ID和右 dfs。

有关 merge 的更多信息以及进一步examples .

关于python - Pandas :加入 'on' 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22963345/

相关文章:

python - 从变量渲染 HTML 标签而不转义

python - 使用 : GridSearchCV, 管道、OneVsRestClassifier、SGDClassifier 的 Scikit-learn 多输出分类器

python - 获取上下文 basemap 以填充地 block

python - pandas groupby 多列

python - dbscan - 设置最大集群跨度限制

python-3.x - Pandas 使用值(如果不为空),否则使用下栏中的值

python-3.x - 如何使用多索引数据框创建 seaborn 回归图?

python - 导入错误 : No module named 'pandas.core.internals.managers' ; 'pandas.core.internals' is not a package

python - 基于具有非空值的另一列,使用 lambda 在数据框中创建一列

python - 遍历用户输入和列表