使用 R 数据表的 .SDcols 样式的 pydatatable 更新或添加多列
Updating or adding multiple columns with pydatatable in style of R datable's .SDcols
给定虹膜数据,我想添加与找到的所有数字列相对应的新列。我可以明确列出每个数字列:
from datatable import fread, f, mean, update
iris_dt = fread("https://h2o-public-test-data.s3.amazonaws.com/smalldata/iris/iris.csv")
iris_dt[:, update(C0_dist_from_mean = dt.abs(f.C0 - mean(f.C0)),
C1_dist_from_mean = dt.abs(f.C1 - mean(f.C1)),
C2_dist_from_mean = dt.abs(f.C2 - mean(f.C2)),
C3_dist_from_mean = dt.abs(f.C3 - mean(f.C1)))]
但那样我就硬编码了列名。使用 .SDcols
:
的 R 数据表可以轻松获得更强大的方法
library(data.table)
iris = fread("https://h2o-public-test-data.s3.amazonaws.com/smalldata/iris/iris.csv")
cols = names(sapply(iris, class)[sapply(iris, class)=='numeric'])
iris[, paste0(cols,"_dist_from_mean") := lapply(.SD, function(x) {abs(x-mean(x))}),
.SDcols=cols]
今天有没有办法对 pydatatable 采取类似的方法?
我知道如何获取 py-datatable 中的所有数字列,例如像这样:
iris_dt[:, f[float]]
但这是在 R 中使用 .SDcols
的最后一部分让我回避。
创建新列名和 f 表达式的字典理解,然后在 update
方法中解压它:
from datatable import f, update, abs, mean
aggs = {f"{col}_dist_from_mean" : abs(f[col] - mean(f[col]))
for col in iris_dt[:, f[float]].names}
iris_dt[:, update(**aggs)]
更新:
使用 v1.1 中的类型属性,这是一种替代方法:
aggs = {f"{col}_dist_from_mean" : dt.math.abs(f[col] - f[col].mean())
for col, col_type
in zip(iris_dt.names, iris_dt.types)
if col_type.is_float}
您还可以将步骤分块:
使用计算值创建一个框架:
expression = f[float]-f[float].mean()
expression = dt.math.abs(expression)
compute = iris_dt[:, expression]
重命名 compute
的列标签:
compute.names = [f"{name}_dist_from_mean" for name in compute.names]
更新 iris_dt
为 compute
(请注意,您也可以使用 cbind
):
iris_dt[:, update(**compute)]
给定虹膜数据,我想添加与找到的所有数字列相对应的新列。我可以明确列出每个数字列:
from datatable import fread, f, mean, update
iris_dt = fread("https://h2o-public-test-data.s3.amazonaws.com/smalldata/iris/iris.csv")
iris_dt[:, update(C0_dist_from_mean = dt.abs(f.C0 - mean(f.C0)),
C1_dist_from_mean = dt.abs(f.C1 - mean(f.C1)),
C2_dist_from_mean = dt.abs(f.C2 - mean(f.C2)),
C3_dist_from_mean = dt.abs(f.C3 - mean(f.C1)))]
但那样我就硬编码了列名。使用 .SDcols
:
library(data.table)
iris = fread("https://h2o-public-test-data.s3.amazonaws.com/smalldata/iris/iris.csv")
cols = names(sapply(iris, class)[sapply(iris, class)=='numeric'])
iris[, paste0(cols,"_dist_from_mean") := lapply(.SD, function(x) {abs(x-mean(x))}),
.SDcols=cols]
今天有没有办法对 pydatatable 采取类似的方法?
我知道如何获取 py-datatable 中的所有数字列,例如像这样:
iris_dt[:, f[float]]
但这是在 R 中使用 .SDcols
的最后一部分让我回避。
创建新列名和 f 表达式的字典理解,然后在 update
方法中解压它:
from datatable import f, update, abs, mean
aggs = {f"{col}_dist_from_mean" : abs(f[col] - mean(f[col]))
for col in iris_dt[:, f[float]].names}
iris_dt[:, update(**aggs)]
更新:
使用 v1.1 中的类型属性,这是一种替代方法:
aggs = {f"{col}_dist_from_mean" : dt.math.abs(f[col] - f[col].mean())
for col, col_type
in zip(iris_dt.names, iris_dt.types)
if col_type.is_float}
您还可以将步骤分块:
使用计算值创建一个框架:
expression = f[float]-f[float].mean()
expression = dt.math.abs(expression)
compute = iris_dt[:, expression]
重命名 compute
的列标签:
compute.names = [f"{name}_dist_from_mean" for name in compute.names]
更新 iris_dt
为 compute
(请注意,您也可以使用 cbind
):
iris_dt[:, update(**compute)]