我希望根据类似于pyarrow.Table.take的数据帧的row_id/row_number获得行的子集.例如:给定以下数据帧

from datetime import datetime

df = pl.DataFrame(
    {
        "integer": [1, 2, 3, 4, 5],
        "date": [
            datetime(2022, 1, 1),
            datetime(2022, 1, 2),
            datetime(2022, 1, 3),
            datetime(2022, 1, 4),
            datetime(2022, 1, 5),
        ],
        "float": [4.0, 5.0, 6.0, 7.0, 8.0],
    }
)

print(df)

shape: (5, 3)
┌─────────┬─────────────────────┬───────┐
│ integer ┆ date                ┆ float │
│ ---     ┆ ---                 ┆ ---   │
│ i64     ┆ datetime[μs]        ┆ f64   │
╞═════════╪═════════════════════╪═══════╡
│ 1       ┆ 2022-01-01 00:00:00 ┆ 4.0   │
│ 2       ┆ 2022-01-02 00:00:00 ┆ 5.0   │
│ 3       ┆ 2022-01-03 00:00:00 ┆ 6.0   │
│ 4       ┆ 2022-01-04 00:00:00 ┆ 7.0   │
│ 5       ┆ 2022-01-05 00:00:00 ┆ 8.0   │
└─────────┴─────────────────────┴───────┘

我正在寻找采取像函数df. take([0,4]),它给出了下面的框架.

shape: (2, 3)
┌─────────┬─────────────────────┬───────┐
│ integer ┆ date                ┆ float │
│ ---     ┆ ---                 ┆ ---   │
│ i64     ┆ datetime[μs]        ┆ f64   │
╞═════════╪═════════════════════╪═══════╡
│ 1       ┆ 2022-01-01 00:00:00 ┆ 4.0   │
│ 5       ┆ 2022-01-05 00:00:00 ┆ 8.0   │
└─────────┴─────────────────────┴───────┘

行号是某个其他过程的结果,并被移交.try 使用df.select(pl.all().take([take_indices]),注意到它比实际直接运行筛选器慢.即df.filter(filter_expr).请注意,我正在对非常大的数据集(>df.select(pl.all().take([take_indices])M行)执行此操作.

编辑:感谢您的回答.使用DF[[Take_Index]]起作用了.然而,仍然好奇的是,为什么Filter的性能仍然优于selt.ather和方括号方法.对我的具有5000万行的数据集进行计时:

Select .聚集:.5s 正方形_括号:.32s[与莫兹韦的计时一致] 过滤器:.18s

推荐答案

df[[0,4]]将允许 Select 索引0和4.

由于take已被弃用,因此与您建议的代码等效的是使用gather:

df.select(pl.all().gather([0, 4]))

输出:

shape: (2, 3)
┌─────────┬─────────────────────┬───────┐
│ integer ┆ date                ┆ float │
│ ---     ┆ ---                 ┆ ---   │
│ i64     ┆ datetime[μs]        ┆ f64   │
╞═════════╪═════════════════════╪═══════╡
│ 1       ┆ 2022-01-01 00:00:00 ┆ 4.0   │
│ 5       ┆ 2022-01-05 00:00:00 ┆ 8.0   │
└─────────┴─────────────────────┴───────┘

500k行的定时:

# df.select(pl.all().gather([0, 4]))
145 µs ± 9.43 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# df[[0,4]]
122 µs ± 14.3 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

5M行的计时:

# df.select(pl.all().gather([0, 4]))
150 µs ± 13.3 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# df[[0,4]]
117 µs ± 17.7 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

Python相关问答推荐

使用Keras的线性回归参数估计

将特定列信息移动到当前行下的新行

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

log 1 p numpy的意外行为

Pandas:将多级列名改为一级

字符串合并语法在哪里记录

如何更新pandas DataFrame上列标题的de值?

使用特定值作为引用替换数据框行上的值

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

从旋转的DF查询非NaN值

比Pandas 更好的 Select

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

30个非DATETIME天内的累计金额

Python 3试图访问在线程调用中实例化的类的对象

如何在Python中自动创建数字文件夹和正在进行的文件夹?

比较两个有条件的数据帧并删除所有不合格的数据帧

如何在python tkinter中绑定键盘上的另一个回车?

为什么在生成时间序列时,元组索引会超出范围?

Fake pathlib.使用pyfakefs的类变量中的路径'

401使用有效的OAuth令牌向Google Apps脚本Web App发出POST请求时出现未经授权的错误(";