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

cbeh67ev  于 2024-01-04  发布在  Python
关注(0)|答案(4)|浏览(140)
  1. from datatable import dt, f, g, by, update, join, sort
  2. tt = dt.Frame({'a' : ['A1','A2','A3'], 'b':[100,200,300]})
  3. print(tt)
  4. | a b
  5. -- + -- ---
  6. 0 | A1 100
  7. 1 | A2 200
  8. 2 | A3 300
  9. [3 rows x 2 columns]

字符串

如何删除a列中的“A”,并以datatable方式将其作为数字分配给新列“c”(即w/o pandas)?

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

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


datatable本机版本不太起作用

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


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

30byixjq

30byixjq1#

这里有一个黑客,不特别规模好:
步骤1:将a列转储到原生python中,并创建一个值元组:

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

字符串
步骤2:cbind返回tt帧:

  1. tt.cbind(dt.Frame(tuples))
  2. tt
  3. a b C0 C1
  4. 0 A1 100 A 1
  5. 1 A2 200 A 2
  6. 2 A3 300 A 3


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

  1. tt["A_only"] = dt.Frame([entry[0] for entry in tt['a'].to_list()[0]])
  2. tt
  3. a b A_only
  4. 0 A1 100 A
  5. 1 A2 200 A
  6. 2 A3 300 A


如前所述,这并不能很好地扩展,此外,它也不能提供datatable所追求的速度。
目前,datatable还没有很好的字符串操作支持(我相信库维护人员目前正在处理这个问题,以及其他一些请求的特性)

展开查看全部
kx1ctssn

kx1ctssn2#

我知道这是一个老问题,但如果有人仍然在寻找这个-在刚刚发布的1.0.0中,可以做以下事情:

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

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

8yparm6h

8yparm6h3#

这是我做的一个黑客来得到你想要的。我仍然在学习数据表,所以请容忍我,而我完全进入它。
首先,将数据表转换成一个框架。执行我前面列出的操作,然后将框架转换回数据表。Walla,现在你有了一个带有所需结果的数据表。
我是这么做的

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

字符串
其输出将是:


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

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


输出将是:
初始DataFrame将是:

  1. a b
  2. 0 A1 100
  3. 1 A2 200
  4. 2 A3 300


新的DataFrame看起来像这样:

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


或者,你也可以使用extract和正则表达式来实现。

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


它会给你给予同样的结果:

  1. a b
  2. 0 A1 100
  3. 1 A2 200
  4. 2 A3 300


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

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

展开查看全部
l5tcr1uw

l5tcr1uw4#

下面这个就可以了。

  1. from datatable import dt, f, update
  2. tt[:, update(c = dt.int32(f.a[1:]))]
  3. print(tt)
  4. | a b c
  5. | str32 int32 int32
  6. -- + ----- ----- -----
  7. 0 | A1 100 1
  8. 1 | A2 200 2
  9. 2 | A3 300 3
  10. [3 rows x 3 columns]

字符串

相关问题