首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python,列上的字符串操作

python,列上的字符串操作
EN

Stack Overflow用户
提问于 2020-10-12 06:19:33
回答 3查看 1.2K关注 0票数 2
代码语言:javascript
复制
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”?

pandas的帮助下,它会是这样的

代码语言:javascript
复制
tt['c'] = tt.to_pandas()['a'].str.replace('A','').astype(int)

datatable本机版本不能完全工作。

代码语言:javascript
复制
tt[:, update(c = [int(x.replace('A','')) for x in f.a])]
TypeError: 'datatable.FExpr' object is not iterable

顺便问一下,对于一个经常使用蟒蛇熊猫和R data.table的用户来说,是否有一本高级/完整的食谱可以帮助从R data.table过渡到py-datatable?网站上有一个页面,但还不够。

EN

回答 3

Stack Overflow用户

发布于 2020-10-13 01:36:03

这里有一个不太适合扩展的黑客:

步骤1:将a列转储到本机python并创建值的元组:

代码语言:javascript
复制
tuples = [(entry[0], entry[-1]) for entry  in tt['a'].to_list()[0]]

步骤2:克林丁返回到tt框架:

代码语言:javascript
复制
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,那么您可以使用下面的代码,它仍然不能很好地缩放(假设您在列中有空值),并且非常粗糙(我们必须索引到列表中才能得到我们想要的):

代码语言:javascript
复制
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没有很好的字符串操作支持(我认为库维护人员目前正在处理这个问题,以及其他一些要求的特性)

票数 3
EN

Stack Overflow用户

发布于 2021-07-03 13:43:02

我知道这是一个老问题,但如果有人还在寻找这个问题--在刚刚发布的1.0.0中,我们可以这样做:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2020-10-12 08:06:55

这是我为了得到你想要的而做的一次黑客攻击。我仍然在学习数据,所以请容忍我,而我完全投入其中。

首先,将datatable转换为dataframe。执行前面列出的操作,然后将dataframe转换回datatable。现在,您有了一个具有所需结果的datatable。

所以我就是这么做的。

代码语言:javascript
复制
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

这方面的产出如下:

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

代码语言:javascript
复制
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将是:

代码语言:javascript
复制
    a    b
0  A1  100
1  A2  200
2  A3  300

新的DataFrame将如下所示:

代码语言:javascript
复制
    a    b  c  d
0  A1  100  A  1
1  A2  200  A  2
2  A3  300  A  3

另外,您还可以使用extract和正则表达式来完成它。

代码语言:javascript
复制
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)

它会给你同样的结果:

代码语言:javascript
复制
    a    b
0  A1  100
1  A2  200
2  A3  300

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

代码语言:javascript
复制
    a    b  c  d
0  A1  100  A  1
1  A2  200  A  2
2  A3  300  A  3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64312612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档