pandas python数据表,列上的字符串操作

cbeh67ev  于 9个月前  发布在  Python
关注(0)|答案(4)|浏览(95)
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”,并以datatable方式将其作为数字分配给新列“c”(即w/o pandas)?

pandas的帮助下,它看起来像这样。

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


datatable本机版本不太起作用

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?网站上有一个页面,但还不够。

30byixjq

30byixjq1#

这里有一个黑客,不特别规模好:
步骤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所追求的速度。
目前,datatable还没有很好的字符串操作支持(我相信库维护人员目前正在处理这个问题,以及其他一些请求的特性)

kx1ctssn

kx1ctssn2#

我知道这是一个老问题,但如果有人仍然在寻找这个-在刚刚发布的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

8yparm6h

8yparm6h3#

这是我做的一个黑客来得到你想要的。我仍然在学习数据表,所以请容忍我,而我完全进入它。
首先,将数据表转换成一个框架。执行我前面列出的操作,然后将框架转换回数据表。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

l5tcr1uw

l5tcr1uw4#

下面这个就可以了。

from datatable import dt, f, update
tt[:, update(c = dt.int32(f.a[1:]))]

print(tt)
   | a          b      c
   | str32  int32  int32
-- + -----  -----  -----
 0 | A1       100      1
 1 | A2       200      2
 2 | A3       300      3
[3 rows x 3 columns]

字符串

相关问题