我想从极坐标数据框中过滤所有重复的行。我尝试过的:
\ndf = 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) 我正在使用 Python 的 Polars 0.13.46,并且有一列包含字符串列表,我需要检查特定字符串是否出现在另一个字符串之前。我创建了以下有效的代码示例,但需要使用 打破极坐标apply,这使得速度非常慢。
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()\nRun 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) 我正在尝试将 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)。
我希望计算列中的连续值,最好使用 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) 我了解 Polars 系列可以导出到 Python 列表。但是,有什么方法可以将 Polars Dataframe 转换为 Python 列表吗?
此外,如果 Polars 数据框中只有一列,如何将其转换为 Polars 系列?
我尝试使用 pandas 命令但没有成功。我还查了Polars官方网站,看有没有相关的内置功能,但没有看到。
每组在随机行中只有一个有效值或 not_null 值。如何为每个组填充该值?
\nimport 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)\nRun Code Online (Sandbox Code Playgroud)\nshape: (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) 我正在尝试计算 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。
我正在寻找一种方法来检测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)
这对我来说并不是一个优雅的解决方案,我想知道是否有更好的方法来做到这一点,甚至有一个可用的库可以完成此类事情。
是否有一些聪明的替代方法可以编写长的when().then().otherwise()链而不对值进行硬编码,请参见下面的示例:
\n假设我们有以下数据框
\ndf = 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)\nRun Code Online (Sandbox Code Playgroud)\n用户将一些条件定义为不同国家的字典
\nparams = {\n "AT":{"Value": 1},\n "DE":{"Value": 2},\n "CA":{"Value": 3},\n "UK":{"Value": 1},\n "US":{"Value": 2}\n}\nRun 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) 我在 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-polars ×10
python ×4
dataframe ×3
pandas ×2
datetime ×1
format ×1
parsing ×1
python-3.x ×1
rust-polars ×1
series ×1