聚合极坐标中缺失值的多列

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

我正在尝试执行一些聚合,虽然我喜欢极地,但有些事情我无法执行。以下是我的做法和问题供参考。

import polars as pl
import polars.selectors as cs

import numpy as np

data = pl.DataFrame({'x': ['a', 'b', 'a', 'b', 'a', 'a', 'a', 'b', 'a'],
                     'y': [2, 3, 4, 5, 6, 7, 8, 9, 10],
                     'z': [4, np.nan, np.nan, 8,1, 1, 3, 4, 0],
                     'm' : [np.nan, 8, 1, np.nan, 3, 4, 8, 7, 1]})

我有一个像上面这样的数据框。这是我的问题和相应的尝试

  1. 如何计算多列上的多个摘要(我收到重复列错误,如何解决此问题?)

尝试:

data.group_by('x').agg(pl.all().mean(),
                       pl.all().sum())

  1. 为什么中位数是有效值,而平均值却不是? 可能的答案:是否因为中位数是通过排序和选择中间值来计算的,并且由于在这种情况下中心值不为空,因此它是有效的(不确定这是否是原因)
print(data.select(pl.col('m').median())) ## line 1
print(data.select(pl.col('m').mean())) ## line 2

  1. 如果我将

    np.nan
    替换为
    None
    ,平均计算在上述代码中的“第 2 行”上工作正常,为什么?

  2. 为什么这不起作用?我收到一个计算错误,其中显示:不允许扩展多个

    col
    ,它的真正含义是什么?基本上我想过滤任意列中缺少的任何行


data.filter(pl.col(['z']).is_nan() | pl.col(['m']).is_nan())
  1. 如何一次性替换多列中的
    NaN
    ,我写了这段代码,它也可以工作,但是它很笨重,有没有更好的方法?
mean_impute = np.nanmean(data.select(pl.col(['z', 'm'])).to_numpy(), axis=0)


def replace_na(data, colname, i):
    return data.with_columns(pl.when(pl.col(colname).is_nan()
                                        ).then(mean_impute[i]).otherwise(pl.col(colname)).alias(colname)).select(colname).to_numpy().flatten()

data.with_columns(z = replace_na(data, 'z', 0),
                  m = replace_na(data, 'm', 1))

感谢您阅读问题并回答。我不想在 SO 中放入重复的条目。我了解规则,因此请告诉我这些规则是否有任何重复。我很乐意删除它们。但我无法解决其中一些问题,或者编写了一个可能不太好的解决方案。再次感谢!!!

编辑:

运行的Python版本:'3.10.9'

运行极地版本:'0.20.31'

python-3.x python-polars
1个回答
0
投票

如何计算多列上的多个摘要(我收到重复列错误,如何解决此问题?)

重命名表达式以避免重复列错误 - 一种方法是通过 prefix 表达式:

In [7]: data.group_by('x').agg(pl.all().mean(), pl.all().sum().prefix('sum_'))
Out[7]:
shape: (2, 7)
┌─────┬──────────┬─────┬─────┬───────┬───────┬───────┐
│ x   ┆ y        ┆ z   ┆ m   ┆ sum_y ┆ sum_z ┆ sum_m │
│ --- ┆ ---      ┆ --- ┆ --- ┆ ---   ┆ ---   ┆ ---   │
│ str ┆ f64      ┆ f64 ┆ f64 ┆ i64   ┆ f64   ┆ f64   │
╞═════╪══════════╪═════╪═════╪═══════╪═══════╪═══════╡
│ a   ┆ 6.166667 ┆ NaN ┆ NaN ┆ 37    ┆ NaN   ┆ NaN   │
│ b   ┆ 5.666667 ┆ NaN ┆ NaN ┆ 17    ┆ NaN   ┆ NaN   │
└─────┴──────────┴─────┴─────┴───────┴───────┴───────┘

为什么中位数是有效值,而平均值却不是?可能的答案:是否因为中位数是通过排序和选择中间值来计算的,并且由于在这种情况下中心值不为空,因此它是有效的(不确定这是否是原因)

极性以不同的方式处理空值和 NaN - 这篇文章在这里解释得更好 - TLDR - 用空值替换 NaN :

data.select(pl.col('m').fill_nan(None).mean())
Out[12]:
shape: (1, 1)
┌──────────┐
│ m        │
│ ---      │
│ f64      │
╞══════════╡
│ 4.571429 │
└──────────┘
© www.soinside.com 2019 - 2024. All rights reserved.