# 一、datatable安装
pip install datatable
# 二、datatable引入
import datatable as dt
# 三、读取文件
# 读取单个文件:fread
# 读取123.csv,各列以|分隔
frame_a = dt.fread("123.csv", sep="|")
# frame_a 内容
id|name|age
1|a|11
2|b|12
3|c|13
# 读取文件列表并合并
file_list = ["123.csv", "234.csv"]
frame_all = dt.rbind(dt.iread(file_list, sep="|"))
# 多个文件frame合并(frame_a, frame_b)
frame_b = dt.fread("234.csv", sep="|")
frame_c = dt.rbind(frame_a, frame_b)
# 四、获取指定行,列数据
# 获取前两行数据
frame_d = frame_b[:2, :]
# 获取前两列数据,两种方式一样
frame_e = frame_d[:, :2]
frame_f = frame_d[:, ["id", "name"]]
# 获取前两行,前两列数据,两种方式一样
frame_g = frame_a[:2, :2]
frame_h = frame_a[:2, ["id", "name"]]
# 获取列year的所有数据
frame_i = frame_a[:, ["year"]]
# 五、获取满足条件的数据(&取交集,|取并集)
# 获取frame_a id=1 并且 name=a的数据
frame_j = frame_a[(dt.f["id"] == 1)&(dt.f["name"] == "a"), :]
frame_b = frame_a[(dt.f["id"] == 1)|(dt.f["year"]==2022), :]
# 获取frame_a id>1 的name,year数据的前两条,head()可以跟在frame后面代表获取前几行
frame_k = frame_a[(dt.f["id"]>1), ["name", "year"]].head(2)
# 六、获取frame的列名
name_list = list(frame_a.names)
# 七、group by数据聚合(去重)
# frame_a 按照id,name 进行聚合,对year进行求和
frame_l = frame_a[:, [dt.f["year"].sum()], dt.by("id", "name")]
# 八、join两表关联,key值在两个frame必须存在,且frame_mkey值必须唯一
frame_m = frame_b
frame_m.key = ["id", "name"]
frame_n = frame_a[:, :, dt.join(frame_m)]
# 九、对frame_a 对year排序,对name,age分组,取前三所有列的数据(由sort的负号决定,负号表示取最大值)
frame_o = frame_a[:3, :, dt.by(dt.f["name"], dt.f["age"]), dt.sort(-dt.f["year"])]
# 十、修改列名称
name_dict = {"id": "new_id", "age": "new_age"}
frame_a.names = name_dict
# 十一、修改特定位置的值:
# 修改frame_a第二行第一列的值为3
frame_a[2, 1] = 3
# 十二、删除特定位置的值
# 删除第二行第一列的值
del frame_a[2, 1]
# 十三、删除列
# 删除frame_a的year列
del frame_a[:, "year"]
# 十四、按条件删除
# 删除frame_a id=2的值
del frame_a[dt.f["id"] ==2, :]
# 十五、数据转换
# to_pandas
frame_p = frame_a.to_numpy()
# to_list
frame_q = frame_a[:, "age"].to_list()
# to_csv(以逗号分隔)
frame_q.to_csv("save.csv", header=True)
# 十六、给无表头的hive小文件添加表头
frame_a.names = ["id", "name", "year"]
# 十七、替换某列的某个值,用|来并联两个条件满足其一即可
# 替换:如果year的值为None或者为空则替换为否,默认更新当前datatable值
frame_a[:, dt.update(**{"year": dt.ifelse((dt.f["year"] == None) | (dt.f["year"] == ""), "否", dt.f["year"])})]
# 十八、修改某一列的数据类型
# 把frame_a的id修改为str类型
frame_a["id"] = str
# 十九、解决文件datatable拼接或join时str32与int64无法拼接或join的问题
# 重写datatable的fread方法,并且在读取文件时直接限定列的数据类型
@classmethod
def fread(cls, file, columns: dict):
names = list(columns.keys())
types_ = list(columns.values())
df = dt.fread(file, header=None, columns=names)
if types_ != df.types:
as_types = [dt.as_type(dt.f[k], v) for k, v in columns.items()]
df = df[:, as_types]
return df
frame_dict = {"id": dt.Type.int64, "name": dt.Type.str32, "year": dt.Type.int64}
frame_a = dt.rbind(
[fread(["123.csv", "234.csv"], columns=frame_dict)])
# 20.重写fread后,仍出现int32和float64等数据类型问题,有可能是fread时未指定sep
# datatable两列相加作为第三列
data = dt.Frame({'a': [1, 2, 3, 4], 'b': [4, 5, 6, 7]})
print(data)
data['c'] = dt.f.a / dt.f.b
print(data)