fill_null() 值与其他列数据

问题描述 投票:0回答:3

我有一个关于填充空值的问题,是否可以像 pandas 那样从其他列回填数据?

有关如何回填数据的 pandas 示例:

df.loc[:, ['A', 'B', 'C']] = df[['A', 'B', 'C']].fillna(
    value={
        'A': df['D'],
        'B': df['D'],
        'C': df['D'],
    }
) 

Polars 示例,如果值为空,我尝试将数据从 D 列回填到 A 列,但它不起作用:

df = pl.DataFrame(
        {"date": ["2020-01-01 00:00:00", "2020-01-07 00:00:00", "2020-01-14 00:00:00"],
        "A": [3, 4, 7],
        "B": [3, 4, 5],
        "C": [0, 1, 2],
        "D": [1, 2, 5]})
df = df.with_column(pl.col("date").str.strptime(pl.Datetime, "%Y-%m-%d %H:%M:%S"))
date_range = df.select(pl.arange(df["date"][0], df["date"]
                        [-1] + 1, step=1000*60*60*24).cast(pl.Datetime).alias("date"))
df = (date_range.join(df, on="date", how="left"))
df['D'] = df['D'].fill_null("forward")
print(df)
df[:, ['A']] = df[['A']].fill_null({
    'A': df['D']
    }
)
print(df)

亲切的问候, 汤姆

python dataframe multiple-columns fillna python-polars
3个回答
3
投票

在您展示的示例中以及随附的 pandas 代码。

fillna
不会填充任何空值,因为其他列也是
NaN
。因此,我假设您想用另一列没有缺失值的值来填充缺失值,但如果我错了,请纠正我。

import polars as pl
from polars import col

df = pl.DataFrame({
    "a": [0, 1, 2, 3, None, 5, 6, None, 8, None],
    "b": range(10),
})

out = df.with_columns([
    pl.when(col("a").is_null()).then(col("b")).otherwise(col("a")).alias("a"),
    pl.when(col("a").is_null()).then(col("b").shift(1)).otherwise(col("a")).alias("a_filled_lag"),
    pl.when(col("a").is_null()).then(col("b").mean()).otherwise(col("a")).alias("a_filled_mean")

])

print(out)

在上面的示例中,我们使用

when -> then -> othwerwise
表达式通过其他列值填充缺失值。考虑
if else expressions
,然后考虑整个列。

我给出了 3 个示例,一个是我们填充该值,一个是我们填充滞后值,一个是我们填充另一列的平均值。

上面的代码片段产生:

shape: (10, 4)
┌─────┬─────┬──────────────┬───────────────┐
│ a   ┆ b   ┆ a_filled_lag ┆ a_filled_mean │
│ --- ┆ --- ┆ ---          ┆ ---           │
│ i64 ┆ i64 ┆ i64          ┆ f64           │
╞═════╪═════╪══════════════╪═══════════════╡
│ 0   ┆ 0   ┆ 0            ┆ 0.0           │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1   ┆ 1   ┆ 1            ┆ 1             │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2   ┆ 2   ┆ 2            ┆ 2             │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 3   ┆ 3   ┆ 3            ┆ 3             │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ... ┆ ... ┆ ...          ┆ ...           │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 5   ┆ 5   ┆ 5            ┆ 5             │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 6   ┆ 6   ┆ 6            ┆ 6             │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 7   ┆ 7   ┆ 6            ┆ 4.5           │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 8   ┆ 8   ┆ 8            ┆ 8             │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 9   ┆ 9   ┆ 8            ┆ 4.5           │
└─────┴─────┴──────────────┴───────────────┘



1
投票

Polars 为用户提供

pl.Expr.fill_null
来填充缺失值。使用方法如下。

import polars as pl

df = pl.DataFrame({
    "a": [0, 1, 2, 3, None, 5, 6, None, 8, None],
    "b": range(10),
})

(
    df
    .with_columns(
        pl.col("a").fill_null(pl.col("b")).alias("a_filled"),
        pl.col("a").fill_null(pl.col("b").shift()).alias("a_filled_lag"),
        pl.col("a").fill_null(pl.col("b").mean()).alias("a_filled_mean"),
    )
)
shape: (10, 5)
┌──────┬─────┬──────────┬──────────────┬───────────────┐
│ a    ┆ b   ┆ a_filled ┆ a_filled_lag ┆ a_filled_mean │
│ ---  ┆ --- ┆ ---      ┆ ---          ┆ ---           │
│ i64  ┆ i64 ┆ i64      ┆ i64          ┆ f64           │
╞══════╪═════╪══════════╪══════════════╪═══════════════╡
│ 0    ┆ 0   ┆ 0        ┆ 0            ┆ 0.0           │
│ 1    ┆ 1   ┆ 1        ┆ 1            ┆ 1.0           │
│ 2    ┆ 2   ┆ 2        ┆ 2            ┆ 2.0           │
│ 3    ┆ 3   ┆ 3        ┆ 3            ┆ 3.0           │
│ null ┆ 4   ┆ 4        ┆ 3            ┆ 4.5           │
│ 5    ┆ 5   ┆ 5        ┆ 5            ┆ 5.0           │
│ 6    ┆ 6   ┆ 6        ┆ 6            ┆ 6.0           │
│ null ┆ 7   ┆ 7        ┆ 6            ┆ 4.5           │
│ 8    ┆ 8   ┆ 8        ┆ 8            ┆ 8.0           │
│ null ┆ 9   ┆ 9        ┆ 8            ┆ 4.5           │
└──────┴─────┴──────────┴──────────────┴───────────────┘

0
投票

fillna()方法用于在pandas中填充空值。

df['D'] = df['D'].fillna(df['A'].mean())

上述代码将用

D
列的平均值替换
A
列的空值。

© www.soinside.com 2019 - 2024. All rights reserved.