我在Pandas 身上有这样的代码:

df[col] = (
            df[col]
            .fillna(method="ffill", limit=1)
            .apply(lambda x: my_function(x))
        )

我想用Polars重写这篇文章.

我试过这个:

df = df.with_columns(
            pl.col(col)
            .fill_null(strategy="forward", limit=1)
            .apply(lambda x: my_function(x))
        )

它不能正常工作.它填充了前进策略,但忽略了使用我定义的函数填充缺失的值.我应该在代码中更改什么才能获得我想要的东西?

试试这个代码:

df_polars = pl.DataFrame(
    {"A": [1, 2, None, None, None, None, 4, None], "B": [5, None, None, None, None, 7, None, 9]}
)

df_pandas = pd.DataFrame(
    {"A": [1, 2, None, None, None, None, 4, None], "B": [5, None, None, None, None, 7, None, 9]}
)

last_valid_data: int


def my_function(x):
    global last_valid_data
    if x == None or np.isnan(x):
        result = last_valid_data * 10
    else:
        last_valid_data = x
        result = x
    return result


col = "A"

last_valid_data = df_pandas[col][0]
df_pandas[col] = df_pandas[col].fillna(method="ffill", limit=1).apply(lambda x: my_function(x))

last_valid_data = df_polars[col][0]
df_polars = df_polars.with_columns(
    pl.col(col).fill_null(strategy="forward", limit=1).apply(lambda x: my_function(x))
)

Pandas 的期望yields 是:

      A    B
0   1.0  5.0
1   2.0  NaN
2   2.0  NaN
3  20.0  NaN
4  20.0  NaN
5  20.0  7.0
6   4.0  NaN
7   4.0  9.0

我在北极星上得到的是:

┌──────┬──────┐
│ A    ┆ B    │
│ ---  ┆ ---  │
│ i64  ┆ i64  │
╞══════╪══════╡
│ 1    ┆ 5    │
│ 2    ┆ null │
│ 2    ┆ null │
│ null ┆ null │
│ null ┆ null │
│ null ┆ 7    │
│ 4    ┆ null │
│ 4    ┆ 9    │
└──────┴──────┘

推荐答案

这里的问题是,在Polars中,.apply缺省为skip_nulls=True

df_polars.with_columns(
   pl.col('A').apply(lambda me: print(f'{me=}'))
)
me=1
me=2
me=4

由于您的示例特别需要以空值为目标,因此需要将其更改为False

df_polars.with_columns(
   pl.col('A').apply(lambda me: print(f'{me=}'), skip_nulls=False)
)
me=1
me=2
me=None
me=None
me=None
me=None
me=4
me=None

Python相关问答推荐

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

如何从具有不同len的列表字典中创建摘要表?

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

如果值发生变化,则列上的极性累积和

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

如何设置视频语言时上传到YouTube与Python API客户端

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

实现神经网络代码时的TypeError

合并帧,但不按合并键排序

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

关于两个表达式的区别

计算空值

30个非DATETIME天内的累计金额

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

如何在Python中将超链接添加到PDF中每个页面的顶部?

解决Geopandas和Altair中的正图和投影问题

有没有办法让Re.Sub报告它所做的每一次替换?

极柱内丢失类型信息""

我如何处理超类和子类的情况