标签: python-polars

获取极坐标数据框中所有重复行的最佳方法

我想从极坐标数据框中过滤所有重复的行。我尝试过的:

\n
df = pl.DataFrame([[\'1\', \'1\', \'1\', \'1\'], [\'7\', \'7\', \'2\', \'7\'], [\'3\', \'9\', \'3\', \'9\']])\ndf\nshape: (4, 3)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 column_0 \xe2\x94\x86 column_1 \xe2\x94\x86 column_2 \xe2\x94\x82\n\xe2\x94\x82 ---      \xe2\x94\x86 ---      \xe2\x94\x86 ---      \xe2\x94\x82\n\xe2\x94\x82 str      \xe2\x94\x86 str      \xe2\x94\x86 str      \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1        \xe2\x94\x86 7        \xe2\x94\x86 3        \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 1        \xe2\x94\x86 7        \xe2\x94\x86 9        \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 1        \xe2\x94\x86 2        \xe2\x94\x86 3        \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 1        \xe2\x94\x86 7        \xe2\x94\x86 9        \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n\ndf.filter(pl.all().is_duplicated())\nshape: (3, 3)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 column_0 \xe2\x94\x86 column_1 \xe2\x94\x86 column_2 \xe2\x94\x82\n\xe2\x94\x82 ---      \xe2\x94\x86 ---      \xe2\x94\x86 ---      \xe2\x94\x82\n\xe2\x94\x82 str      \xe2\x94\x86 str      \xe2\x94\x86 str      \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 …
Run Code Online (Sandbox Code Playgroud)

dataframe python-3.x python-polars

6
推荐指数
1
解决办法
6901
查看次数

极坐标中列表列数据的索引操作

我正在使用 Python 的 Polars 0.13.46,并且有一列包含字符串列表,我需要检查特定字符串是否出现在另一个字符串之前。我创建了以下有效的代码示例,但需要使用 打破极坐标apply,这使得速度非常慢。

\n
import polars as pl\nfrom polars import col\n\ndf = pl.DataFrame(\n    {\n        \'str\': [\'A\', \'B\', \'C\', \'B\', \'A\'],\n        \'group\': [1,1,2,1,2]\n    }\n).lazy()\n\ndf_groups = df.groupby(\'group\').agg([col(\'str\').list().alias(\'str_list\')])\nprint(df_groups.collect())\n\npre = \'A\'\nsucc = \'B\'\n\ndf_groups_filtered = df_groups.filter(\n    col(\'str_list\').apply(\n        lambda str_list: \n            pre in str_list and succ in str_list and \n            str_list.to_list().index(pre) < str_list.to_list().index(succ)\n    )\n)\n\ndf_groups_filtered.collect()\n
Run Code Online (Sandbox Code Playgroud)\n

这提供了所需的结果,这只是示例数据的两行中的第一行:

\n
\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 group \xe2\x94\x86 str_list        \xe2\x94\x82\n\xe2\x94\x82 ---   \xe2\x94\x86 ---             \xe2\x94\x82\n\xe2\x94\x82 i64   \xe2\x94\x86 list[str]       \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1     \xe2\x94\x86 ["A", "B", "B"] \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 2     \xe2\x94\x86 ["C", "A"]      \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n …
Run Code Online (Sandbox Code Playgroud)

python-polars

6
推荐指数
2
解决办法
2568
查看次数

从 Pandas 到 Polars 的数据帧转换——最终尺寸的差异

我正在尝试将 Pandas Dataframe 转换为 Polar Dataframe。

我只是简单地使用了该功能result_polars = pl.from_pandas(result)。转换进展顺利,但是当我检查两个数据帧的形状时,我发现 Polars 数据帧的大小是原始 Pandas 数据帧的一半。

我相信长度 4172903059 几乎是极坐标数据帧允许的最大尺寸。

有人有建议吗?

这是两个数据框形状的屏幕截图。

这是一个最小工作示例

import polars as pl
import pandas as pd
import numpy as np

df = pd.DataFrame(np.zeros((4292903069,1), dtype=np.uint8))
df_polars = pl.from_pandas(df)
Run Code Online (Sandbox Code Playgroud)

使用这些维度,两个数据框具有相同的大小。如果我输入以下内容:

import polars as pl
import pandas as pd
import numpy as np

df = pd.DataFrame(np.zeros((4392903069,1), dtype=np.uint8))
df_polars = pl.from_pandas(df)
Run Code Online (Sandbox Code Playgroud)

Polars 数据框的尺寸要小得多 (97935773)。

data-conversion dataframe pandas rust-polars python-polars

5
推荐指数
1
解决办法
2401
查看次数

使用 Polars 计算布尔(或数字)列中连续的 True(或 1)值?

我希望计算列中的连续值,最好使用 Polars 表达式。

import polars
df = pl.DataFrame(
   {"values": [True,True,True,False,False,True,False,False,True,True]}
)
Run Code Online (Sandbox Code Playgroud)

通过上面的示例数据框,我想计算连续 True 值的数量。

下面是使用 R 的 Data.Table 包的示例输出。

library(data.table)
dt <- data.table(value = c(T,T,T,F,F,T,F,F,T,T))
dt[, value2 := fifelse((1:.N) == .N & value == 1, .N, NA_integer_), by = rleid(value)]
dt
Run Code Online (Sandbox Code Playgroud)
价值 值2
真的 不适用
真的 不适用
真的 3
错误的 不适用
错误的 不适用
真的 1
错误的 不适用
错误的 不适用
真的 不适用
真的 2

有什么想法可以使用 Polars 有效地完成此操作吗?

[用新方法编辑]

我用下面的代码让它工作,但希望有一种更有效的方法。有人知道 value_counts 中的默认结构/字典字段名称吗?

(
    df.lazy()
    .with_row_count()
    .with_column(
        pl.when(pl.col("value") == False).then(
            pl.col("row_nr")
            
        ).fill_null(
            strategy …
Run Code Online (Sandbox Code Playgroud)

python-polars

5
推荐指数
1
解决办法
539
查看次数

Polars:如何将 Polars 数据框转换为 Python 列表'

我了解 Polars 系列可以导出到 Python 列表。但是,有什么方法可以将 Polars Dataframe 转换为 Python 列表吗?

此外,如果 Polars 数据框中只有一列,如何将其转换为 Polars 系列?

我尝试使用 pandas 命令但没有成功。我还查了Polars官方网站,看有没有相关的内置功能,但没有看到。

python series dataframe python-polars

5
推荐指数
1
解决办法
1万
查看次数

Polars:用每组内唯一有效的值填充空值

每组在随机行中只有一个有效值或 not_null 值。如何为每个组填充该值?

\n
import polars as pl\n\ndata = {\n    \'group\': [\'1\', \'1\', \'1\', \'2\', \'2\', \'2\', \'3\', \'3\', \'3\'],\n    \'col1\': [1, None, None, None, 3, None, None, None, 5],\n    \'col2\': [\'a\', None, None, None, \'b\', None, None, None, \'c\'],\n    \'col3\': [False, None, None, None, True, None, None, None, False]\n}\ndf = pl.DataFrame(data)\n
Run Code Online (Sandbox Code Playgroud)\n
shape: (9, 4)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 group \xe2\x94\x86 col1 \xe2\x94\x86 col2 \xe2\x94\x86 col3  \xe2\x94\x82\n\xe2\x94\x82 ---   \xe2\x94\x86 ---  \xe2\x94\x86 ---  \xe2\x94\x86 ---   \xe2\x94\x82\n\xe2\x94\x82 str   \xe2\x94\x86 i64  \xe2\x94\x86 str  \xe2\x94\x86 bool  \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 …
Run Code Online (Sandbox Code Playgroud)

python-polars

5
推荐指数
1
解决办法
1308
查看次数

如何实现滚动均值忽略空值

我正在尝试计算 RSI 指标。为此,我需要滚动平均损益。

我想计算滚动平均值忽略空值。因此平均值将通过现有值的总和和计数来计算。

例子:

window_size = 5

df = DataFrame(price_change: { 1, 2, 3, -2, 4 })

df_gain = .select(
            pl.when(pl.col('price_change') > 0.0)
            .then(pl.col('price_change'))
            .otherwise(None)
            .alias('gain')
          )

# UNKOWN HOW TO GET WANTED RESULT:
rol_mean_gain = df_gain.select(
                  pl.col('gain').rolling_mean(window_size=window_size, ignore_null=True)
                )
Run Code Online (Sandbox Code Playgroud)

以便计算 rol_mean_gain:[1, 2, 3, skip, 4] / 4 (not 5)

我知道 Pandas 有.mean(skipna=True).apply(pandas.np.nanmean) 但据我所知 Polars 不提供这样的 API。

python pandas python-polars

5
推荐指数
1
解决办法
338
查看次数

在Python中检测日期时间字符串的格式

我正在寻找一种方法来检测strftimePython 中日期时间字符串的 -style 格式。我发现的所有日期时间库都具有解析字符串以创建日期时间对象的功能,但我想检测可与格式datetime.strptime参数一起使用的格式或模式。

为什么?我正在处理长列表(或系列)的日期时间字符串,并使用dateutil.parser它们来解析它们太不准确且缓慢。

  • :它每次都会检查所有潜在的格式,尽管每个列表的所有条目都具有相同的格式(在我的例子中)。
  • 不准确:不明确的条目将以多种方式中的一种进行解析,而不从其他明确的条目中获取知识。

所以我想检测格式。一旦有了这个,我就可以使用该to_datetime函数polars以更快的方式创建日期时间序列。

我在更现代的日期时间库(如钟摆)中找不到这样的功能。我还实现了我自己的版本,它迭代固定的格式列表并检查是否可以使用datetime.strptime如下方式读取它:

patterns = [
        "%Y.%m.%d %H:%M:%S",
        "%Y-%m-%d %H:%M",
        "%Y-%m-%d",
        ...
    ]

    for pattern in patterns:
        try:
            for val in col:
                assert datetime.datetime.strptime(val, pattern)
            return pattern
        except:
            continue
Run Code Online (Sandbox Code Playgroud)

这对我来说并不是一个优雅的解决方案,我想知道是否有更好的方法来做到这一点,甚至有一个可用的库可以完成此类事情。

python format datetime parsing python-polars

5
推荐指数
1
解决办法
676
查看次数

长 .when().then().when().then().otherwise() 链的替代方案

是否有一些聪明的替代方法可以编写长的when().then().otherwise()链而不对值进行硬编码,请参见下面的示例:

\n

假设我们有以下数据框

\n
df = pl.DataFrame(\n    {\n        "Market":["AT", "AT", "DE", "DE", "CA", "DE", "UK", "US"],\n        "Number of Days":[1, 2, 3, 4, 3, 4, 2, 1],\n        \n    }\n)\n
Run Code Online (Sandbox Code Playgroud)\n

用户将一些条件定义为不同国家的字典

\n
params = {\n    "AT":{"Value": 1},\n    "DE":{"Value": 2},\n    "CA":{"Value": 3},\n    "UK":{"Value": 1},\n    "US":{"Value": 2}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后我对国家/地区进行硬编码并使用 Polars .with_columns() 中的国家/地区,如下所示:

\n
(\n    df\n    .with_columns(\n        [\n            pl.when(pl.col("Market") == "AT").then(pl.col("Number of Days") + params["AT"]["Value"])\n            .when(pl.col("Market") == "DE").then(pl.col("Number of Days") + params["DE"]["Value"])\n            .when(pl.col("Market") == "CA").then(pl.col("Number of Days") + params["CA"]["Value"])\n            .when(pl.col("Market") == "UK").then(pl.col("Number of Days") …
Run Code Online (Sandbox Code Playgroud)

python-polars

5
推荐指数
1
解决办法
194
查看次数

Polars:“ValueError:无法将值‘未知’转换为文字”

我在 Polars 中有一行代码,在我最近将 Polars 包更新为“0.19.0”之前,该代码行有效。这个例子之前运行过:

import polars as pl

df = pl.DataFrame(
    {
        "a": [5, 6, 7, 8, 9],
        "b": [5, 6, 7, 8, 9],
        "c": [5, 6, 7, 8, None],})

cols_1 = ["a", "b"]
cols_2 = ["c"]

df = df.filter(pl.all(pl.col(cols_1 + cols_2).is_not_null()))

Run Code Online (Sandbox Code Playgroud)

但现在引发错误:

ValueError: could not convert value 'Unknown' as a Literal
Run Code Online (Sandbox Code Playgroud)

python python-polars

5
推荐指数
1
解决办法
1152
查看次数