pandas Polars apply function不将列名传递给函数

yqlxgs2m  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(93)

我正在将我的旧代码从pandas迁移到polars。但我无法为应用函数找到变通方法。我有一个函数,我从apply函数接收的数据中进行一些计算,我必须使用一些列。
我在pandas中的代码:

import pandas as pd

data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)

self.var1 = 'A'
self.var2 = 'B'

def some_calculation(row):
    var  = self.var1
    var2 = self.var2
    cal1 = row[var] + row[var2]
    cal2 = row[var] * row[var2]
    return list(zip(cal1 , cal2))

df['calc_data'] = df.apply(some_calculation, axis=1)

字符串
现在,在浏览了polars文档并使用apply函数后,我发现它不传递列名,因此我无法进行计算,因为我的数据框架可能有不同的列,我无法找到解决方案。
请帮帮我

cbeh67ev

cbeh67ev1#

解决方案是停止从apply的Angular 思考。

你可以这样做

(
    pl.from_pandas(df)
    .with_columns(
        calc_data= pl.concat_list(
            pl.col(var1)+pl.col(var2), 
            pl.col(var1)*pl.col(var2)
            )
        )
)
shape: (3, 3)
┌─────┬─────┬───────────┐
│ A   ┆ B   ┆ calc_data │
│ --- ┆ --- ┆ ---       │
│ i64 ┆ i64 ┆ list[i64] │
╞═════╪═════╪═══════════╡
│ 1   ┆ 4   ┆ [5, 4]    │
│ 2   ┆ 5   ┆ [7, 10]   │
│ 3   ┆ 6   ┆ [9, 18]   │
└─────┴─────┴───────────┘

字符串
虽然你可能不希望返回列表,所以你可以做一些类似的事情

(
    pl.from_pandas(df)
    .with_columns(
            calc1=pl.col(var1)+pl.col(var2), 
            calc2=pl.col(var1)*pl.col(var2)
            )
)
shape: (3, 4)
┌─────┬─────┬───────┬───────┐
│ A   ┆ B   ┆ calc1 ┆ calc2 │
│ --- ┆ --- ┆ ---   ┆ ---   │
│ i64 ┆ i64 ┆ i64   ┆ i64   │
╞═════╪═════╪═══════╪═══════╡
│ 1   ┆ 4   ┆ 5     ┆ 4     │
│ 2   ┆ 5   ┆ 7     ┆ 10    │
│ 3   ┆ 6   ┆ 9     ┆ 18    │
└─────┴─────┴───────┴───────┘


如果您坚持要维护反模式,即带名称的逐行迭代,那么您可以使用iter_rows(named=True)为每一行获取dict s的生成器。
你的功能,如定义,不为我工作,所以我修改它到这个...

var1='A'
var2='B'
def some_calculation(row):
    cal1 = row[var1] + row[var2]
    cal2 = row[var1] * row[var2]
    return [cal1 , cal2]


这样的话我就...

df['calc_data'] = df.apply(some_calculation, axis=1)
df
A  B calc_data
0  1  4    [5, 4]
1  2  5   [7, 10]
2  3  6   [9, 18]


使用generator你可以:

pldf=pl.from_pandas(df)
pldf.with_columns(
    calc_data=pl.Series(some_calculation(x) for x in pldf.iter_rows(named=True))
)
shape: (3, 3)
┌─────┬─────┬───────────┐
│ A   ┆ B   ┆ calc_data │
│ --- ┆ --- ┆ ---       │
│ i64 ┆ i64 ┆ list[i64] │
╞═════╪═════╪═══════════╡
│ 1   ┆ 4   ┆ [5, 4]    │
│ 2   ┆ 5   ┆ [7, 10]   │
│ 3   ┆ 6   ┆ [9, 18]   │
└─────┴─────┴───────────┘


也就是说,如果您要保持行迭代,那么“迁移”到polars几乎没有什么好处。

相关问题