polars使用DataFrame的行与Expression API。

huangapple go评论71阅读模式
英文:

polars use Expression API with DataFrame's rows

问题

我是一个新的 polars 用户,我想在每一行的 polars DataFrame 上应用一个函数。在 pandas 中,我会使用 apply 函数,并指定函数的输入是 DataFrame 的行而不是列。

我看到了 polars 库的 apply 函数,并且文档中建议使用 Expression API 而不是在 polars 的 DataFrame 上使用 apply 函数,因为这更有效率。文档中有关于 Expression API 的示例,但 select 函数通常用于 DataFrame 的列。是否有一种方法可以在 DataFrame 的行上使用 Expression API?

为提供示例而进行的编辑

我有一个具有以下结构的 DataFrame

l=[(1,2,3,4,22,23,None,None),(5,6,8,10,None,None,None,None)]
df=pl.DataFrame(data=l, orient='row')

也就是说,该 DataFrame 在某一点直到结尾,一行具有 None 值。在此示例中,第一行的 None 值从第6列开始,而第二行的 None 值从第4列开始。

我想要做的是找到将这个 DataFrame 转换为只有三列的最有效的 polars 方法,其中第一列是行的第一个元素,第二列是行的第二个元素,第三列将包含以下列中不是 None 的所有其他元素的列表。

英文:

I am a new polars user and I want to apply a function in every polars DataFrame row. In pandas I would use the apply function specifying that the input of the function is the DataFrame's row instead of the DataFrame's column(s).

I saw the apply function of polars library, and it says that it is preferable, because it is much more efficient, to use the Expression API instead of the apply function on a polars DataFrame. The documentation has examples of the Expression API with the select function, but select is used with the DataFrames's columns. Is there a way to use the Expression API with the rows of the DataFrame?

Edit for providing an example

I have a DataFrame with this structure

l=[(1,2,3,4,22,23,None,None),(5,6,8,10,None,None,None,None)]
df=pl.DataFrame(data=l, orient='row')

i.e. a DataFrame that at some point and until the end, a row has None values. In this example, in the first row the None values start at column 6, while in the second, the None values start at column 4.

What I want to do is to find the most efficient polars way to turn this DataFrame into a DataFrame with only three columns, where the first column is the first element of the row, the second column is the second element of the row, and the third will have as a list all the other elements of the following columns that are not None.

答案1

得分: 2

如果您正在使用列名,您可以:

  • 通过名称选择前2列
  • 从除了这2个命名列之外的所有列创建一个列表
  • 使用.arr.eval从列表中删除空值
df.select(
   pl.col("column_0", "column_1"), 
   pl.concat_list(pl.exclude("column_0", "column_1"))
     .arr.eval(pl.element().drop_nulls())
)
形状: (2, 3)
┌──────────┬──────────┬──────────────┐
│ column_0 ┆ column_1 ┆ column_2     │
│ ---      ┆ ---      ┆ ---          │
│ i64      ┆ i64      ┆ list[i64]    │
╞══════════╪══════════╪══════════════╡
│ 1        ┆ 2        ┆ [3, 4, … 23] │
│ 5        ┆ 6        ┆ [8, 10]      │
└──────────┴──────────┴──────────────┘
英文:

If you're using the column names, you can:

df.select(
   pl.col("column_0", "column_1"), 
   pl.concat_list(pl.exclude("column_0", "column_1"))
     .arr.eval(pl.element().drop_nulls())
)
shape: (2, 3)
┌──────────┬──────────┬──────────────┐
│ column_0 ┆ column_1 ┆ column_2     │
│ ---      ┆ ---      ┆ ---          │
│ i64      ┆ i64      ┆ list[i64]    │
╞══════════╪══════════╪══════════════╡
│ 1        ┆ 2        ┆ [3, 4, … 23] │
│ 5        ┆ 6        ┆ [8, 10]      │
└──────────┴──────────┴──────────────┘

huangapple
  • 本文由 发表于 2023年5月22日 20:15:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/76306096.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定