英文:
How can I summarize all columns of a polars dataframe
问题
在Polars中,要执行与Pandas中相同的操作,可以使用apply
方法和agg
方法来实现。以下是在Polars中执行相同操作的代码:
import polars as pl
import numpy as np
# Toy Data
data = {'a': [1, 2, 3, 4, 5], 'b': [2, 4, 6, 8, 10]}
# Create a Polars DataFrame
pdf = pl.DataFrame(data)
# Function I want to use to summarize my columns
my_func = lambda x: pl.log(x.mean())
# How to do this in Polars
result = pdf.agg(pl.col("a").apply(my_func).alias("a_summary"),
pl.col("b").apply(my_func).alias("b_summary"))
result.show()
这段代码中,我们首先创建了一个Polars DataFrame pdf
,然后定义了要应用于列的自定义函数 my_func
。接下来,我们使用agg
方法来应用这个函数,并使用apply
方法将其应用于每列,同时使用alias
方法为每列创建一个摘要列。最后,我们使用show
方法来显示结果。
英文:
Pandas makes it easy to summarize columns of a dataframe with an arbitrary function using df.apply(my_func, axis=0)
.
How can I do the same in polars? Shown below is a MWE. I have a function (just an example, I would like to do this for arbitrary functions) that I can apply to entire columns. The function summarizes columns in pandas using the syntax I've shown.
What is the syntax to perform the same operation in polars?
import polars as pl
import pandas as pd
import numpy as np
# Toy Data
data = {'a':[1, 2, 3, 4, 5],
'b': [2, 4, 6, 8, 10]}
# Pandas and polars copy
df = pd.DataFrame(data)
pdf = pl.DataFrame(data)
# Function I want to use to summarize my columns
my_func = lambda x: np.log(x.mean())
# How to do this in pandas
df.apply(my_func, axis=0)
# How do I do the same in polars?
答案1
得分: 2
请参阅 map
。在这里,它必须在 select
上下文中使用,请查看书中的部分以获取更多注意事项。
pdf.select(pl.all().map(my_func))
英文:
See map
. It must be used in the select
context here, see the section in the book on more caveats.
pdf.select(pl.all().map(my_func))
答案2
得分: 2
你真的不应该在 Polars 中使用 Python 函数,因为 Polars 中有表达式可以实现你的目标。
data = {'a': [1, 2, 3, 4, 5],
'b': [2, 4, 6, 8, 10]}
df = pl.DataFrame(data)
df.select(
pl.all().mean().log()
)
每次使用 map
或 apply
都是一种代码异味,除非无法以不同的方式完成。
上下文
在 Polars 中计算任何内容的惯用方式是使用表达式。有许多原因应优先使用表达式:
- 它们并行运行
- 它们可以被优化
- 它们在 Rust 中编译
Python 函数对 Polars 来说是不透明的。它无法被优化,因为我们不知道它做什么,也不知道输出是什么。
OP 描述了它希望运行任何任意函数。这在表达式中是包括的。任何表达式都可以使用 map
或 apply
,并接受 Python 函数作为逃生通道。因此,回答如何在所有列上运行表达式是回答如何在所有列上运行 Python 函数的超集。
英文:
You really shouldn't use python functions when there are expressions in polars that can achieve your goal.
data = {'a':[1, 2, 3, 4, 5],
'b': [2, 4, 6, 8, 10]}
df = pl.DataFrame(data)
df.select(
pl.all().mean().log()
)
Every map
or apply
is a code smell and should be avoided unless it cannot be done differently.
Context
The idiomatic way to compute anything in polars is using expressions. They should be preferred for a number of reasons:
- they run parallel
- they can be optimized
- they are compiled in rust
A python function is opaque to polars. It can not be optimized because we don't know what it does, nor what the output is.
OP describes it wants to run any arbitrary function. This is included in expressions. Any expression can take a map
or apply
and accept a python function as escape hatch. For this reason answering how you can run an expression on all columns is a superset of answering how you can run a python function on all columns.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论