在极坐标中,制作数据帧副本的方法是什么?在熊猫中它将是:
df_copy = df.copy()
Run Code Online (Sandbox Code Playgroud)
但是极坐标的语法是什么?
在 Pandas 中,您可以使用at属性更新值,如下所示:
import pandas as pd
df = pd.DataFrame({"col1": [1, 2, 3], "col2": [4, 5, 6]})
df.at[2, "col2"] = 99
print(df)
# Output
col1 col2
0 1 4
1 2 5
2 3 99
Run Code Online (Sandbox Code Playgroud)
在 Polars 中执行此操作的惯用方法是什么?
我正在尝试在极坐标上进行apply简单的value_counts()多列操作dataframe,但出现错误。
import polars as pl
import pandas as pd
Run Code Online (Sandbox Code Playgroud)
数据:
sample_df = pl.DataFrame({'sub-category': ['tv','mobile','tv','wm','micro','wm'],
'category': ['electronics','mobile','electronics','electronics','kitchen','electronics']})
Run Code Online (Sandbox Code Playgroud)
失败的尝试:
#1
sample_df.apply(value_counts())
#2
sample_df.apply(lambda x: x.value_counts())
#3
sample_df.apply(lambda x: x.to_series().value_counts())
#4
sample_df.select(pl.col(['sub-category','category'])).apply(lambda x: x.value_counts())
#5
sample_df.select(pl.col(['sub-category','category'])).apply(lambda x: x.to_series().value_counts())
Run Code Online (Sandbox Code Playgroud)
但如果我将其转换为Pandas数据框,那么它就可以工作:
sample_df.to_pandas().apply(lambda x: x.value_counts())
Run Code Online (Sandbox Code Playgroud) 我有一个字符串格式的 UUID 时间序列,我希望 Polars 将它们转换为 u128 数字,以便更好地存储和查询。
与我们对日期所做的类似:
....str.strptime(pl.Datetime, fmt="%Y-%m-%dT%H:%M:%S.%fZ", strict=False)
Run Code Online (Sandbox Code Playgroud)
这是受支持的,还是我需要在 Python 端处理它?
另外,我没有看到u128类型,但有一个Decimal似乎是i128. 如果我自己翻译,我应该使用哪种类型?
PS 我注意到Polars 存储库中有一个关于支持 Rust crate 的GitHub 票证Uuid,但在某种程度上,这可以在没有它的情况下实现。所以,我不确定是否是这样。
pandas 的替代品是什么:
data['ColumnA'].str[:2]
Run Code Online (Sandbox Code Playgroud)
在蟒蛇极地?
pl.col('ColumnA').str[:3]
Run Code Online (Sandbox Code Playgroud)
抛出TypeError: 'ExprStringNameSpace' object is not subscriptable
错误。
我想将多个DataFrames不同形状的添加在一起。
在添加 之前DataFrames,我们的想法是通过添加缺失的行(使用“索引”列作为参考)和缺失的列(用 0 填充)来重塑它们。
以下是输入的示例:
\nimport polars as pl\n\na = pl.DataFrame(\n data={"index": [1, 2, 3], "col_1": [1, 0, 0], "col_2": [1, 1, 1]}\n)\n\nb = pl.DataFrame(\n data={"index": [1, 2, 3], "col_1": [1, 1, 1], "col_2": [1, 1, 1]}\n)\n\nc = pl.DataFrame(\n data={"index": [1, 4, 5], "col_1": [10, 10, 10], "col_3": [1, 1, 1]}\n)\nRun Code Online (Sandbox Code Playgroud)\n预期结果是:
\nshape: (5, 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\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\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 index \xe2\x94\x86 col_1 \xe2\x94\x86 col_2 \xe2\x94\x86 col_3 \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 --- \xe2\x94\x86 --- \xe2\x94\x86 --- …Run Code Online (Sandbox Code Playgroud) 所以我有一个极坐标列/系列,它是数字字符串。
s = pl.Series("a", ["111","123","101"])
s
shape: (3,)
Series: 'a' [str]
[
"111"
"123"
"101"
]
Run Code Online (Sandbox Code Playgroud)
我想将每个字符串转换为整数列表。我找到了一个可行的解决方案,但我不确定它是否是最佳的。
s.str.split("").arr.shift(1).arr.slice(2).arr.eval(pl.element().str.parse_int(10))
shape: (3,)
Series: 'a' [list[i32]]
[
[1, 1, 1]
[1, 2, 3]
[1, 0, 1]
]
Run Code Online (Sandbox Code Playgroud)
我首先在每个点分割字符串。对于第一行,这给了我["","1","1","1",""]。由此我想删除第一个和最后一个条目(空字符串)。由于我事先不知道条目的长度,并且切片不允许指定结束索引,因此我使用了 shift -> slice 版本,但我觉得必须有更好的方法。
最后是parse_int的应用。
这似乎有效,但我想知道是否有更好的方法来执行此操作或任何单独的步骤。
我对极坐标表达式语法非常满意,以至于我的很多特征工程都是用极坐标表达式来表达的。
但是,我现在尝试将功能工程转移到 JSON 或 YAML 文件(出于 MLOps 原因)。
问题是 - 我如何将其编码为 JSON 文件:
configuration = {
'features': [
pl.col('col1').fill_null(0).log().le(0.2).alias('feature1'),
pl.col('col2').fill_null(0).log().le(0.2).alias('feature2'),
pl.col('col3').fill_null(0).log().le(0.2).alias('feature3')
],
'filters': [
pl.col('col4') >= 500_000,
pl.col('col5').is_in(['A', 'B'])
]
}
# This is how I use it - just for context
X = (df
.filter(pl.all(configuration['filters']))
.select(configuration['features'])
)
Run Code Online (Sandbox Code Playgroud)
关于如何将其序列化(或重写)为 JSON 以便将其转换回 Polars 表达式的任何想法?
请注意,这个问题与Maybe to Stringize a Polars Expression?有很多重叠。,但它不是重复的。
我正在尝试按文档后面的极坐标数据框进行分组:
import polars as pl
df = pl.DataFrame(
{
"a": ["a", "b", "a", "b", "c"],
"b": [1, 2, 1, 3, 3],
"c": [5, 4, 3, 2, 1],
}
)
df.group_by("a").agg(pl.col("b").sum())
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
AttributeError: 'DataFrame' object has no attribute 'group_by'
Run Code Online (Sandbox Code Playgroud) 我对 with_columns 中的 Polars LazyFrame“Structs”(pl.struct)和“apply”(又名 map_elements)有以下问题
这里的想法是尝试将自定义逻辑应用于属于多个列的一组值
我已经能够使用 DataFrames 实现这一点;但是,当切换到 LazyFrames 时,每当我尝试访问由结构发送到函数的字典中的列时,就会引发 KeyError。我逐一循环列,以便应用不同的函数(在其他地方映射到它们的名称,但在下面的示例中,为了简单起见,我将仅使用相同的函数)
my_df = pl.DataFrame(
{
"foo": ["a", "b", "c", "d"],
"bar": ["w", "x", "y", "z"],
"notes": ["1", "2", "3", "4"]
}
)
print(my_df)
cols_to_validate = ("foo", "bar")
def validate_stuff(value, notes):
# Any custom logic
if value not in ["a", "b", "x"]:
return f"FAILED {value} - PREVIOUS ({notes})"
else:
return notes
for col in cols_to_validate:
my_df = my_df.with_columns(
pl.struct([col, "notes"]).map_elements(
lambda row: validate_stuff(row[col], row["notes"])
).alias("notes")
)
print(my_df)
Run Code Online (Sandbox Code Playgroud)
python-polars ×10
python ×6
dataframe ×4
apply ×1
keyerror ×1
lazyframe ×1
pandas ×1
python-3.x ×1
rust-polars ×1
setvalue ×1