数据框中列表列的极坐标交集

2023-12-11

import polars as pl

df = pl.DataFrame({'a': [[1, 2, 3], [8, 9, 4]], 'b': [[2, 3, 4], [4, 5, 6]]})

所以给定数据帧 df

    a           b
[1, 2, 3]   [2, 3, 4]
[8, 9, 4]   [4, 5, 6]

我想要一个c列,它是a和b的交集

    a           b          c
[1, 2, 3]   [2, 3, 4]    [2, 3]
[8, 9, 4]   [4, 5, 6]     [4]

我知道我可以将 apply 函数与 python 集交集一起使用,但我想使用极坐标表达式来实现。


极坐标 >= 0.18.10

对列表使用集合操作:

df.select(
   intersection = pl.col('a').list.set_intersection('b'),
   difference = pl.col('a').list.set_difference('b'),
   union = pl.col('a').list.set_union('b')
)  

极坐标 >= 0.18.5,极坐标

对列表使用集合操作(​​使用旧名称):

df.select(
   intersection = pl.col('a').list.intersection('b'),
   difference = pl.col('a').list.difference('b'),
   union = pl.col('a').list.union('b')
)  

极坐标

我们可以使用以下方法完成交集arr.eval表达。这arr.eval表达式允许我们将列表视为系列/列,以便我们可以使用与列和系列相同的上下文和表达式。

首先,让我们扩展您的示例,以便我们可以展示当交集为空时会发生什么。

df = pl.DataFrame(
    {
        "a": [[1, 2, 3], [8, 9, 4], [0, 1, 2]],
        "b": [[2, 3, 4], [4, 5, 6], [10, 11, 12]],
    }
)
df
shape: (3, 2)
┌───────────┬──────────────┐
│ a         ┆ b            │
│ ---       ┆ ---          │
│ list[i64] ┆ list[i64]    │
╞═══════════╪══════════════╡
│ [1, 2, 3] ┆ [2, 3, 4]    │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [8, 9, 4] ┆ [4, 5, 6]    │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [0, 1, 2] ┆ [10, 11, 12] │
└───────────┴──────────────┘

算法

有两种方法可以实现此目的。第一个可扩展到两个以上集合的交集(参见下面的其他注释)。

df.with_column(
    pl.col("a")
    .arr.concat('b')
    .arr.eval(pl.element().filter(pl.count().over(pl.element()) == 2))
    .arr.unique()
    .alias('intersection')
)

or

df.with_column(
    pl.col("a")
    .arr.concat('b')
    .arr.eval(pl.element().filter(pl.element().is_duplicated()))
    .arr.unique()
    .alias('intersection')
)
shape: (3, 3)
┌───────────┬──────────────┬──────────────┐
│ a         ┆ b            ┆ intersection │
│ ---       ┆ ---          ┆ ---          │
│ list[i64] ┆ list[i64]    ┆ list[i64]    │
╞═══════════╪══════════════╪══════════════╡
│ [1, 2, 3] ┆ [2, 3, 4]    ┆ [2, 3]       │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [8, 9, 4] ┆ [4, 5, 6]    ┆ [4]          │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [0, 1, 2] ┆ [10, 11, 12] ┆ []           │
└───────────┴──────────────┴──────────────┘

怎么运行的

我们首先将两个列表连接成一个列表。两个列表中的任何元素都会出现两次。

df.with_column(
    pl.col("a")
    .arr.concat('b')
    .alias('ablist')
)
shape: (3, 3)
┌───────────┬──────────────┬────────────────┐
│ a         ┆ b            ┆ ablist         │
│ ---       ┆ ---          ┆ ---            │
│ list[i64] ┆ list[i64]    ┆ list[i64]      │
╞═══════════╪══════════════╪════════════════╡
│ [1, 2, 3] ┆ [2, 3, 4]    ┆ [1, 2, ... 4]  │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [8, 9, 4] ┆ [4, 5, 6]    ┆ [8, 9, ... 6]  │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [0, 1, 2] ┆ [10, 11, 12] ┆ [0, 1, ... 12] │
└───────────┴──────────────┴────────────────┘

然后我们可以使用arr.eval函数允许我们将串联列表视为一个系列/列。在这种情况下,我们将使用filtercontext 来查找任何出现多次的元素。 (这polars.element列表上下文中的表达式的用法如下polars.col在系列中使用。)

df.with_column(
    pl.col("a")
    .arr.concat('b')
    .arr.eval(pl.element().filter(pl.count().over(pl.element()) == 2))
    .alias('filtered')
)
shape: (3, 3)
┌───────────┬──────────────┬───────────────┐
│ a         ┆ b            ┆ filtered      │
│ ---       ┆ ---          ┆ ---           │
│ list[i64] ┆ list[i64]    ┆ list[i64]     │
╞═══════════╪══════════════╪═══════════════╡
│ [1, 2, 3] ┆ [2, 3, 4]    ┆ [2, 3, ... 3] │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [8, 9, 4] ┆ [4, 5, 6]    ┆ [4, 4]        │
├╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [0, 1, 2] ┆ [10, 11, 12] ┆ []            │
└───────────┴──────────────┴───────────────┘

注:上述步骤也可以用is_duplicated表达。 (在其他注释部分,我们将看到使用is_duplicated当计算两个以上集合的交集时将不起作用。)

df.with_column(
    pl.col("a")
    .arr.concat('b')
    .arr.eval(pl.element().filter(pl.element().is_duplicated()))
    .alias('filtered')
)

剩下的就是使用以下方法从结果中删除重复项arr.unique表达式(这是开头所示的结果)。

其他注意事项

我假设您的列表确实是集合,因为元素在每个列表中仅出现一次。如果原始列表中有重复,我们可以申请arr.unique在串联步骤之前的每个列表。

此外,该过程可以扩展以查找两个以上集合的交集。只需将所有列表连接在一起,然后更改filter一步从== 2 to == n (where n是组数)。 (注:使用is_duplicated上面的表达式不适用于两个以上的集合。)

The arr.eval方法确实有一个parallel关键词。您可以尝试将其设置为True并看看它是否会在您的特定情况下产生更好的性能。

其他集合操作

对称差:改变filter标准为== 1(并省略arr.unique step.)

联盟:使用arr.concat其次是arr.unique.

集合差异:计算交集(如上所述),然后连接原始列表/集合并过滤仅出现的项目once。或者,对于较小的列表大小,您可以将“a”连接到自身,然后连接到“b”,然后过滤出现两次(但不是三次)的元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据框中列表列的极坐标交集 的相关文章

随机推荐

  • postgres 使用什么哈希算法/函数进行 PARTITION BY HASH

    在postgres中 有一个基于的分区hash But postgres没有清楚地解释如何计算给定列值的哈希值 我搜索了 Postgres 文档 但一无所获 除了一些邮箱帖子里 还有人提到hashtext 内部功能 有谁有关于用于散列值的实
  • ggplot:如何使用facet_grid创建不同的x轴标题

    我有两个共享 y 轴但具有不同 x 轴的图 我使用facet grid将它们适当地分开 见图 但是两个x轴需要有不同的标题 而不是一个标题 Num Cell Lines Tissue 我见过类似的方法 首先创建 2 个 ggplot 对象
  • 使用html5和php上传多个文件

    我有一个使用 HTML5 多重属性设置的文件上传表单 但是 该表单仍然只上传单个文件 我是否需要在 php 中创建某种循环函数 或者是否有其他方法可以做到这一点 这是我的代码 form
  • 为什么相同的日期有不同的时间?

    也许答案很明显 但我不明白 为什么代码片段中的日期不同 该格式是否也说明了有关时间的信息 console log 2017 1 9 gt console log new Date 2017 1 9 console log 2017 1 09
  • 如何获取加载的样式表的内容

    我想从页面头部链接的 css 文件中获取样式表规则 或 css textContent document styleSheets似乎适用于所有主流浏览器 但是styleSheets 0 cssRules当然在 IE 对于 IE 你可以使用r
  • 列表从索引中切片[重复]

    这个问题在这里已经有答案了 gt gt gt a a b c d e f g h l gt gt gt a 30 gt gt gt a 30 a b c d e f g h l 我试图理解这种切片背后的逻辑 例如 当我们尝试通过索引访问元素
  • Python中根据多个条件返回列的方法

    我有一个数据框如下 基于一些条件 我需要检索该列 Wifi User1 Wifi User2 Wifi User3 Thermostat Act User1 Act User2 Act User3 58 48 60 18 0 1 0 60
  • Webkit 和 Excel 文件(PHPexcel)

    我有一个可以下载的 excel 文件 例如 NAME xlsx 很好 它在 firefox 中工作 但在 webkit safari chrome 中它也附加到名称扩展名 xhtml那么它的名称将是 NAME xlsx html 它应该是仅
  • 如何创建数字选择器对话框?

    我希望能够创建一个对话框 允许用户从指定范围中选择一个数字 我知道现有的小部件 例如来自 Quietlycoding 的小部件和 SimonVT 的小部件 已经做到了这一点 但我很难将它们正确地集成到我的应用程序中 此外 这些主要是小部件
  • MySQL - 当嵌套选择使用该表时如何从表中删除?

    我正在尝试做这样的事情 DELETE FROM table 1 WHERE table 1 id IN SELECT table 1 id FROM table 1 table 2 table 3 WHERE table 1 id tabl
  • 像 xcode 一样批量优化 iphone/ipad 显示的 PNG

    我正在为 ipad 开发杂志查看器 但我在性能方面遇到了困难 我发现显示 png 最昂贵的部分是加载过程 我知道 xcode 能够在构建过程中优化 png 并且此类图像的加载速度要快得多 但我无法将所有图像都包含到构建中 因为它会很大 您知
  • Angular2 路由器中的生命周期挂钩

    在 angular2 路由器中添加生命周期挂钩时遇到问题 如果任何人都可以分享在 Angular2 路由器中添加生命周期挂钩的代码 那将会很有帮助 我了解了如何添加 可以激活 挂钩 感谢埃里克的帮助 与其他生命周期挂钩不同 CanActiv
  • WCF REST 错误 HTTP 307

    我有一个 REST WCF 服务 当尝试对此服务执行如下操作的 POST 时 我收到以下错误 OperationContract WebInvoke Method POST UriTemplate RequestFormat WebMess
  • 有没有一种干净的方法可以在 Spring Web API 中将字符串返回为 json?

    例如 我必须执行如下 RequestMapping value get string method RequestMethod GET public ResponseBody String getString return Hello Wo
  • Python <> 运算符是什么

    到底是什么 lt gt Python 中的运算符 为什么它没有文档记录 据我所知 是不是一样 or is not In Python 2 x lt gt 是相同的 i e 不等于 而不是is not这是 不等同于 但后者是首选 比较运算符
  • MySQL:要求 SSL 未显示在拨款中

    MySQL 8 不显示REQUIRE SSL in the SHOW GRANTS output 在 MariaDB 上 当我使用创建用户时REQUIRE SSL 它显示在补助金中 Server version 10 2 22 MariaD
  • 如何将 C# 数据表传递给 JavaScript 函数

    我在代码隐藏中有这些数据 并尝试以各种格式将其传递给 javascript 函数 列表数组 json 字符串 但无法通过 javascript var 对象获取数据 这是后面代码中最后一个数据格式 List
  • 如何阻止 Visual Studio“发布网站”发布我的 ReSharper 文件夹?

    这真的很烦人 因为它们不是该项目的一部分 我知道这确实很旧 但也许我的回复会对其他人有所帮助 我在这里找到了解决方案 http www meadow se wordpress p 137 基本上 将这些行添加到选项卡上方 Web 部署项目文
  • Windows 7 上的 XAMPP 上的 Kohana 3.2 错误:目录 APPPATH\cache 必须可写

    当我查看使用 Kohana 3 2 创建的网站时 会出现狂野的错误 Kohana Exception 0 目录 APPPATH cache 必须可写 我使用 Windows 7 和 XAMPP 但不知道该怎么做 因为目录 logs 是可写的
  • 数据框中列表列的极坐标交集

    import polars as pl df pl DataFrame a 1 2 3 8 9 4 b 2 3 4 4 5 6 所以给定数据帧 df a b 1 2 3 2 3 4 8 9 4 4 5 6 我想要一个c列 它是a和b的交集