1
from datatable import dt, f, g, by, update, join, sort

tt = dt.Frame({'a' : ['A1','A2','A3'], 'b':[100,200,300]})

print(tt)
   | a     b
-- + --  ---
 0 | A1  100
 1 | A2  200
 2 | A3  300

[3 rows x 2 columns]

如何删除a列中的“A”并将其分配给新列“c”作为数据表中的数字(即不带熊猫)?

在以下的帮助下看起来像这样pandas

tt['c'] = tt.to_pandas()['a'].str.replace('A','').astype(int)

数据表本机版本不太好用

tt[:, update(c = [int(x.replace('A','')) for x in f.a])]
TypeError: 'datatable.FExpr' object is not iterable

顺便说一句,对于 python pandas 和 R data.table 的频繁用户,是否有一个高级/完整的食谱可以帮助从 R data.table 过渡到 py-datatable?网站上有一个页面,但还不够。

4

3 回答 3

3

这是一个不能很好扩展的hack:

第 1 步:将该列转储a到本机 python 并创建一个值元组:

tuples = [(entry[0], entry[-1]) for entry  in tt['a'].to_list()[0]]

第 2 步:cbind回到tt框架:

tt.cbind(dt.Frame(tuples))

tt


    a   b   C0  C1
0   A1  100 A   1
1   A2  200 A   2
2   A3  300 A   3

如果你只需要 A,那么你可以使用下面的代码,它仍然不能很好地扩展(想象你在列中有空值),并且很粗糙(我们必须索引到列表中才能得到我们想要的) :

tt["A_only"] = dt.Frame([entry[0] for entry in tt['a'].to_list()[0]])

tt

     a   b   A_only
0   A1  100     A
1   A2  200     A
2   A3  300     A

如前所述,这不能很好地扩展。此外,它不提供数据表所针对的速度。

目前,datatable 没有很好的字符串操作支持(我相信库维护人员目前正在努力,以及其他一些要求的功能)

于 2020-10-13T01:36:03.873 回答
0

这是我为了得到你想要的东西而做的一个黑客。我还在学习数据表,所以在我完全投入其中的时候请多多包涵。

首先,将数据表转换为数据框。执行我之前列出的操作,然后将数据帧转换回数据表。Walla,您现在有了一个包含所需结果的数据表。

这就是我的做法。

from datatable import dt, f, g, by, update, join, sort
tt = dt.Frame({'a' : ['A1','A2','A3'], 'b':[100,200,300]})
df = tt.to_pandas()
df = df.join(df.a.str.extract('([a-zA-Z])([0-9])', expand=True).add_prefix('a'))
df = df.rename(columns = {'a0': 'c', 'a1': 'd'})
tt = dt.Frame(df)
tt

输出将是:

在此处输入图像描述

您可以拆分列并重命名字段。

import pandas as pd
df = pd.DataFrame({'a' : ['A1','A2','A3'], 'b':[100,200,300]})
print (df)
df = df.join(df['a'].str.split(r'(\d.*)', expand=True).add_prefix('a'))
df.drop('a2',axis = 1,inplace=True)
df = df.rename(columns = {'a0': 'c', 'a1': 'd'})
print (df)

输出将是:

初始 DataFrame 将是:

    a    b
0  A1  100
1  A2  200
2  A3  300

新的 DataFrame 将如下所示:

    a    b  c  d
0  A1  100  A  1
1  A2  200  A  2
2  A3  300  A  3

或者,您也可以使用extract和正则表达式来完成。

import pandas as pd
df1 = pd.DataFrame({'a' : ['A1','A2','A3'], 'b':[100,200,300]})
df1 = df1.join(df1.a.str.extract('([a-zA-Z])([0-9])', expand=True).add_prefix('a'))
df1 = df1.rename(columns = {'a0': 'c', 'a1': 'd'})
print (df1)

它会给你同样的结果:

    a    b
0  A1  100
1  A2  200
2  A3  300

在此选项中,它不会创建需要删除的附加列

    a    b  c  d
0  A1  100  A  1
1  A2  200  A  2
2  A3  300  A  3
于 2020-10-12T08:06:55.270 回答
0

我知道这是一个老问题,但如果有人还在寻找这个问题——在刚刚发布的 1.0.0 中,可以执行以下操作:

tt = dt.Frame({'a' : ['A1','A2','A3'], 'b':[100,200,300]})
tt["A_only"] = tt[:, f.a[0:1]]
tt["num_only"] = tt[:, f.a[1:]]
tt["num_only"] = dt.Type.int8  # Change the type of the column to `int`
tt.ltypes

以上在字符串列上使用切片,即依赖于固定格式。.re正则表达式也有一个部分,但我只看到match,而不是extract

于 2021-07-03T13:43:02.483 回答