【问题标题】:fill_null() values with other columns datafill_null() 值与其他列数据
【发布时间】:2021-10-24 11:56:44
【问题描述】:

我有一个关于填充空值的问题,是否可以像在 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


    【解决方案1】:

    在您展示的示例和随附的熊猫代码中。 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 个例子,一个用那个值填充,一个用滞后值填充,一个用另一列的平均值填充。

    上面的 sn-p 产生:

    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           │
    └─────┴─────┴──────────────┴───────────────┘
    
    
    

    【讨论】:

      【解决方案2】:

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

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

      上面的代码会将D列的空值替换为A列的平均值。

      【讨论】:

      • OP 要求在 python-polars 中实现与 pandas fillna 函数相同的解决方案。您刚刚发布了一个 pandas 解决方案。
      • 我没有看到更新的问题,因为我回答的时间。
      猜你喜欢
      • 1970-01-01
      • 2020-06-16
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多