我无法in使用预定义的项目列表执行标准操作。我正在寻找做这样的事情:
# Construct a simple example frame
from datatable import *
df = Frame(V1=['A','B','C','D'], V2=[1,2,3,4])
# Filter frame to a list of items (THIS DOES NOT WORK)
items = ['A','B']
df[f.V1 in items,:]
Run Code Online (Sandbox Code Playgroud)
此示例导致错误:
TypeError: A boolean value cannot be used as a row selector
不幸的是,似乎没有用于in操作的内置对象。我想使用类似于%in%R 语言原生的运算符之类的东西。有没有什么方法可以在python中完成这个?
我可以通过使用多个“等于”运算符来采用这种方法,但是当您要考虑大量项目时,这很不方便:
df[(f.V1 == 'A') | (f.V1 == 'B'),:]
Run Code Online (Sandbox Code Playgroud)
数据表 0.10.1
蟒蛇 3.6
如何过滤掉某个列中的值包含在列表中的行?
基本上这是我正在使用的代码:
import datatable as dt
sfr = dt.fread(os.path.join(dirName, 'Results.csv'))
sfr
Out[25]:
| ioid itemtype date itemid tid value
-------- + ---------- -------- -------- ------- ------------ -------
0 | 1 1 7-1-2022 9015 531 0.0283
1 | 1 1 7-1-2022 9015 532 0.0071
2 | 1 1 7-1-2022 9016 534 0.0065
3 | 1 1 7-1-2022 9017 1018 0.0005
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行以下操作
ids = [9016, 9017]
sft[dt.f.itemid.isin(ids)]
Run Code Online (Sandbox Code Playgroud)
但是,我无法使语法起作用。
期望的输出是:
| ioid itemtype date itemid tid value …Run Code Online (Sandbox Code Playgroud) 我可以看到今天刚刚发布了新版本的数据表,我正在尝试将其安装在一台 google colab 机器上。
!pip install datatable
Run Code Online (Sandbox Code Playgroud)
它显示错误如下:
Collecting datatable
Using cached https://files.pythonhosted.org/packages/04/0c/bff6497afcf95a3257c4168b95c8acab91c8ef234fe473eaf6689d582da1/datatable-1.0.0.tar.gz
Getting requirements to build wheel ... done
ERROR: Exception:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/base_command.py", line 153, in _main
status = self.run(options, args)
File "/usr/local/lib/python3.7/dist-packages/pip/_internal/commands/install.py", line 382, in run
resolver.resolve(requirement_set)
File "/usr/local/lib/python3.7/dist-packages/pip/_internal/legacy_resolve.py", line 201, in resolve
self._resolve_one(requirement_set, req)
File "/usr/local/lib/python3.7/dist-packages/pip/_internal/legacy_resolve.py", line 365, in _resolve_one
abstract_dist = self._get_abstract_dist_for(req_to_install)
File "/usr/local/lib/python3.7/dist-packages/pip/_internal/legacy_resolve.py", line 313, in _get_abstract_dist_for
req, self.session, self.finder, self.require_hashes
File "/usr/local/lib/python3.7/dist-packages/pip/_internal/operations/prepare.py", line 224, in prepare_linked_requirement
req, self.req_tracker, finder, …Run Code Online (Sandbox Code Playgroud) 我想知道是否有更简单的方法在 Python 中分配多列,就像:=R 中的那样data.table。
例如,在 Python 中我必须这样写:
df['Col_A'] = df.A/df.B
df['Col_B'] = df.C/df.D
df['Col_C'] = df.E/df.F * 1000000
df['Col_D'] = df.G/df.H * 1000000
Run Code Online (Sandbox Code Playgroud)
然而,这只是 R 中的一行代码data.table:
df[, ':='(Col_A = A/B, Col_B = C/D, Col_C = E/F*1000000, Col_B = G/H*1000000)]
Run Code Online (Sandbox Code Playgroud) python calculated-columns multiple-columns assign py-datatable
我有一个包含两列的数据框,如下所示,
DT_EX = dt.Frame({'film':['Don','Warriors','Dragon','Chicago','Lion','Don','Chicago','Warriors'],
'gross':[400,500,600,100,200,300,900,1000]})
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我想过滤电影是唐或芝加哥的观察,如下代码所示,
DT_EX[((f.film=="Don") | (f.film=="Chicago")),:]
Run Code Online (Sandbox Code Playgroud)
在一秒钟内,我将为 3 个值应用过滤器,
DT_EX[((f.film=="Don") | (f.film=="Chicago") | (f.film=="Lion")),:]
Run Code Online (Sandbox Code Playgroud)
在过滤超过 5 或 10 个值的情况下,我们应该为这些多个值做一个逻辑表达式,这肯定是一项耗时的任务。
是否有任何数据表方法可以更快地完成它?就像%in% %chin%在 R 中有一些过滤选项可用data.table。
给定虹膜数据,我想添加与找到的所有数字列相对应的新列。我可以通过明确列出每个数字列来做到这一点:
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)))]
Run Code Online (Sandbox Code Playgroud)
但这样我就硬编码了列名。使用 R 数据表可以轻松获得更可靠的方法.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]
Run Code Online (Sandbox Code Playgroud)
今天有没有办法对 pydatatable 采取类似的方法?
我确实意识到如何获取 py-datatable 中的所有数字列,例如如下所示:
iris_dt[:, f[float]]
Run Code Online (Sandbox Code Playgroud)
但 R 中使用的最后一部分却让.SDcols我困惑。
相当于 %like% 的 python 的 data.table 是什么?
简短示例:
dt_foo_bar = dt.Frame({"n": [1, 3], "s": ["foo", "bar"]})
dt_foo_bar[re.match("foo",f.s),:] #works to filter by "foo"
Run Code Online (Sandbox Code Playgroud)
我原以为这样的事情会起作用:
dt_foo_bar[re.match("fo",f.s),:]
Run Code Online (Sandbox Code Playgroud)
但它返回“预期的字符串或类似字节的对象”。我很想开始在 Python 中使用新的 data.tables 包,就像我在 R 中使用它的方式一样,但我更多地处理文本数据而不是数字数据。
提前致谢。
Pandas 库有一个非常好的函数调用 .fillna() ,它可以用来填充空值
df = df.fillna(0)
Run Code Online (Sandbox Code Playgroud)
我正在使用数据表库来完成我的新作业,因为它在数据表中加载和处理大量数据的速度非常快。
fillnapython的Datatable库中是否存在这样的函数?
或者我们必须用什么替代方法来填充数据表中的缺失值?
python中的数据表包(https://github.com/h2oai/datatable/)可以计算列中唯一值的数量,有没有办法用这个包删除重复值,或者我必须使用慢速的pandas包裹?
我创建了一个数据表框架如下,
DT_EX = dt.Frame({'cid':[1,2,1,2,3,2,4,2,4,5],
'cust_life_cycle':['Lead','Active','Lead','Active','Inactive','Lead','Active','Lead','Inactive','Lead']})
Run Code Online (Sandbox Code Playgroud)
在这里,我有三个独特的客户生命周期,这些计数中的每一个都被发现为
DT_EX[:, count(), by(f.cust_life_cycle)]
Run Code Online (Sandbox Code Playgroud)
连同它,我有五个客户 ID,这些计数如下
DT_EX[:, count(), by(f.cid)]
Run Code Online (Sandbox Code Playgroud)
现在我想看看每个客户生命周期中存在多少个唯一客户 ID,
DT_EX[:, {'unique_cids':dt.unique(f.cid)}, by(f.cust_life_cycle)]
Run Code Online (Sandbox Code Playgroud)
它应该显示为潜在客户有 3 个唯一客户 ID,例如 (1,2,5),活动用户有 2 个唯一客户 ID (2,4),依此类推。
我无法按预期得到它,你能告诉我如何修复它吗?
仅供参考:我试图在 R data.table 框架上重现相同的内容,它的工作原理。
DT_EX[, uniqueN(cid), by=cust_life_cycle]
Run Code Online (Sandbox Code Playgroud) py-datatable ×10
python ×9
datatable ×2
assign ×1
duplicates ×1
pandas ×1
python-3.8 ×1
python-3.x ×1
r ×1