【问题标题】:Iterate through multiple Pandas list-type series and find matches遍历多个 Pandas 列表类型系列并找到匹配项
【发布时间】:2020-12-28 04:53:59
【问题描述】:

我有一个 Pandas DF,其中包含三个类似列表的系列,我需要对其进行迭代并与外部列表进行比较,然后为找到这些外部列表的完全匹配的行创建一个 True/NaN 系列

休闲密码:

data = {
    "num_elements": [1,3,3,4], 
    "elements_bool_identifiers": [["Y"],["N", "Y"],["N"],["N"]], 
    "elements_identifiers": [["FOO"],["FOO", "BAR"],["FOOBAR"],["FOO", "BAZ"]], 
    "identifiers_selections": [["A"],["A", "B", "B"],["A", "B", "B"],["A", "B", "A"]], 
}

df = pd.DataFrame(data)

valid_elements_bool_identifiers = "N"

valid_elements_identifiers = ["FOOBAR"] # (might be expanded in the future)

valid_identifiers_selections = ["A", "B", "B"]

列表系列同时是一个转换集 (.apply(set).apply(list))

【问题讨论】:

标签: python pandas


【解决方案1】:

Use tuples instead of lists :

import pandas as pd
data = {
    "num_elements": [1,3,3,4], 
    "elements_bool_identifiers": [["Y"],["N", "Y"],["N"],["N"]], 
    "elements_identifiers": [["FOO"],["FOO", "BAR"],["FOOBAR"],["FOO", "BAZ"]], 
    "identifiers_selections": [["A"],["A", "B", "B"],["A", "B", "B"],["A", "B", "A"]], 
}

df = pd.DataFrame(data)

valid_elements_bool_identifiers = ("N",)  # use tuple

valid_elements_identifiers = ("FOOBAR",)  # use tuple

valid_identifiers_selections = ("A", "B", "B")  # use tuple


df["match"] = ((df["elements_bool_identifiers"].map(tuple) == valid_elements_bool_identifiers) &
               (df["elements_identifiers"].map(tuple) == valid_elements_identifiers) &
               (df["identifiers_selections"].map(tuple) == valid_identifiers_selections))
df

否则使用列表会出错:

('长度必须匹配才能比较', (4,), (3,))

【讨论】:

  • 嘿@ismael-el-atifi - 非常感谢您的回答!它在此示例代码上完美运行。然而,奇怪的是,在我的实时数据上,它一直工作到最后一个条件(valid_identifiers_selections);当我通过除那个之外的所有内容时,它工作正常,但是当我包含它时,我得到 NaN(也尝试使用 .loc 但我得到相同的结果)。我检查了所有样本和真实数据列的 type() 并且它们都匹配,但它仍然中断。我会尝试找出问题所在,如果一切顺利,我会接受您的回答,否则可能会回复您。
  • 嘿@ismael-el-atifi - 终于让它工作了......我遇到的 identifiers_selections 问题是我的代码的前一点。该系列实际上是我应用列表的 groupby 对象的结果;这意味着实际的系列是“[A , B , C ]”(注意空格),我必须 apply(str).str.replace(r"(?s)((?![AB])。) *", "", regex = True).apply(list) 让这个工作(我只对这个 groupby 的 A/B 结果感兴趣)。
猜你喜欢
  • 2021-04-07
  • 2017-03-24
  • 2019-06-28
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多