【问题标题】:Pandas: join 'on' failing熊猫:加入'on'失败
【发布时间】:2014-04-09 22:17:58
【问题描述】:

我有两个 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 值。

我做错了什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以只做一个合并来实现你想要的:

    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 的问题在于默认情况下它执行左索引连接,因为您的数据框没有匹配的公共索引值,然后您的评论列最终为空

    编辑

    从 cmets 开始,如果您想保留 df1 中的所有值并仅添加不为空且 ID 存在于 df1 中的 cmets,那么您可以执行 left 合并:

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

    这将删除任何带有空 cmets 的行,使用 ID 列将 df1df2 合并到但执行 left 合并,以便保留左侧的所有值,但将合并匹配 @987654333 的 cmets @列,默认为inner,它保留了左右dfs中的IDs。

    有关mergeexamples 的更多信息。

    【讨论】:

    • 这确实有效,但如果 df2 包含更多的值,对于这个操作,我不感兴趣怎么办?它给出了正确 ID 的注释,但它也添加了很多冗余的重复行......我只想在单个条目上添加 Comment 列。
    • 所以你只想要Comment 不是None 的值?您可以在合并之后或合并期间删除它们:df1.merge(df2.dropna( subset=['Comment']), on='ID') 如果这是您想要的,那么我将更新我的答案
    • 是的,这就是我想要的,但如果我使用它,结果 df1 只包含一行,由于合并...
    • @ErikF。我在这里有点困惑,你只想要不为空的 cmets 并将它们添加到 df1,我不明白你怎么能这样做,因为它违反直觉,你想要df1.merge(df2.dropna( subset=['Comment']), on='ID', how='left')
    • 对不起,如果我很迟钝,我在这方面还是有点新意。我基本上有 df1 和 df2,我想要我在帖子中展示的结果,并认为 .join 将是可以使用的东西。让整个 Comment 列同时包含空和非空都很好,但我不想复制似乎与您的原始解决方案相同的行。
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2016-03-17
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多