3 回答
TA贡献1827条经验 获得超8个赞
这是一个扩展性不是很好的 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
如前所述,这不能很好地扩展。此外,它没有提供数据表所期望的速度。
目前,数据表没有很好的字符串操作支持(我相信库维护者目前正在努力解决这个问题,以及其他一些要求的功能)
TA贡献1836条经验 获得超13个赞
我知道这是一个老问题,但万一有人仍在寻找这个问题——在刚刚发布的 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。
TA贡献1804条经验 获得超7个赞
这是我为了得到你想要的东西而做的一个技巧。我仍在学习数据表,所以请耐心等待我完全进入它。
首先,将数据表转换为数据框。执行我前面列出的操作,然后将数据帧转换回数据表。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)
输出将是:
初始数据框将是:
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
添加回答
举报