我最近做了一个PRdatatable
,展示了在;中转换列的方法。它应该很快被合并。请随时发表评论和更新。
对于题,可以直接赋值,也可以使用update
方法:
from datatable import dt, f, update, Type, as_type
DT0 = dt.Frame({'col_1': ['2021-12-01']
, 'col_2': ['2021-12-02']
, 'col_3': ['foobar']
}
)
cols = ['col_1', 'col_2']
DT0
| col_1 col_2 col_3
| str32 str32 str32
-- + ---------- ---------- ------
0 | 2021-12-01 2021-12-02 foobar
[1 row x 3 columns]
通过重新分配:
DT = DT0.copy()
DT[:, cols] = DT[:, as_type(f[cols], Type.date32)]
DT
| col_1 col_2 col_3
| date32 date32 str32
-- + ---------- ---------- ------
0 | 2021-12-01 2021-12-02 foobar
[1 row x 3 columns]
使用直接赋值,您可以将 f 表达式分配给列;这仅适用于单一分配:
DT = DT0.copy()
DT['col_1'] = as_type(f.col_1, Type.date32)
DT['col_2'] = as_type(f.col_2, Type.date32)
DT
| col_1 col_2 col_3
| date32 date32 str32
-- + ---------- ---------- ------
0 | 2021-12-01 2021-12-02 foobar
[1 row x 3 columns]
该update
功能也有效;我喜欢这个功能,特别是对于类似 SQL 窗口的操作,我不希望列的顺序发生变化(执行 groupby 时数据表排序):
DT = DT0.copy()
DT[:, update(col_1 = dt.as_type(f.col_1, Type.date32),
col_2 = dt.as_type(f.col_2, Type.date32))]
DT
| col_1 col_2 col_3
| date32 date32 str32
-- + ---------- ---------- ------
0 | 2021-12-01 2021-12-02 foobar
[1 row x 3 columns]
请注意,这update
是就地的;无需重新分配。对于多个列,字典可以帮助自动化该过程:
columns = {col : as_type(f[col], Type.date32) for col in cols}
print(columns)
{'col_1': FExpr<as_type(f['col_1'], date32)>,
'col_2': FExpr<as_type(f['col_2'], date32)>}
# unpack the dictionary within the datatable brackets
DT = DT0.copy()
DT[:, update(**columns)]
DT
| col_1 col_2 col_3
| date32 date32 str32
-- + ---------- ---------- ------
0 | 2021-12-01 2021-12-02 foobar
[1 row x 3 columns]