【问题标题】:The result of filter and list comprehension of a DataFrame column is not what I expectedDataFrame 列的过滤和列表理解的结果不是我所期望的
【发布时间】:2018-09-14 00:30:02
【问题描述】:

基本上,我想使用 python 查找 DataFrame A 中但不在 DataFrame B 中的 ID。我按照this post中的建议进行操作,结果却不是我所期望的。

考虑以下场景:

a = pd.DataFrame(data= {"id":[1, 1, 1, 2, 3, 4, 5],'score':[90,90,91,92,93,94,99]})
b = pd.DataFrame(data= {"id":[1, 2, 3, 4, 5],'letter':['a','b','c','d','e']})

在做:

set([x for x in a['id'] if x not in b['id']])

正如the post mentioned above 建议的那样,给出{5},这样做的时候是一样的:

set(filter(lambda x: x not in b['id'], a['id']))

这不是我所期望的。预期的结果应该是一个空的set(),可以通过这样做来实现:

set(a["id"]) - set(b["id"])

有人能解释一下为什么上面的代码会产生不同的结果吗?将不胜感激。

【问题讨论】:

    标签: python dataframe filter


    【解决方案1】:

    b['id'] 是一个熊猫系列对象。 in 运算符将作用于 pandas 系列的 index(数据帧 b 为 0 到 4),而不是实际值。一个快速的解决方法是:

    set([x for x in list(a['id']) if x not in list(b['id'])]) # returns set()
    

    【讨论】:

    • 请不要建议对lists 进行in 检查。列表搜索的复杂度为 O(N)。
    • @coldspeed 是的。 IMO OP 的问题不在于如何去做。这是“为什么我不能像链接中的某个人(在列表中)那样对熊猫系列做同样的事情?”所以我只是展示了一种可能性。其实问题的最后一行代码已经有了低复杂度的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2015-01-08
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多