我正在尝试执行一些聚合,虽然我喜欢极地,但有些事情我无法执行。以下是我的做法和问题供参考。
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]})
我有一个像上面这样的数据框。这是我的问题和相应的尝试
尝试:
data.group_by('x').agg(pl.all().mean(),
pl.all().sum())
print(data.select(pl.col('m').median())) ## line 1
print(data.select(pl.col('m').mean())) ## line 2
如果我将
np.nan
替换为 None
,平均计算在上述代码中的“第 2 行”上工作正常,为什么?
为什么这不起作用?我收到一个计算错误,其中显示:不允许扩展多个
col
,它的真正含义是什么?基本上我想过滤任意列中缺少的任何行
data.filter(pl.col(['z']).is_nan() | pl.col(['m']).is_nan())
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'
如何计算多列上的多个摘要(我收到重复列错误,如何解决此问题?)
重命名表达式以避免重复列错误 - 一种方法是通过 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 │
└──────────┘