我有一个名为“ Lookup”的数据框,看起来像这样:
| Variable | Type
0 | Var1 | object
1 | Var2 | np.uint16
我想用它来创建字典以导入大的csv以保持较小的内存空间。
大型csv太大,无法使用pd.read_csv的low_memory = False选项。
之后我可以更改数据类型或手动键入所有变量,但是我有200多个变量,并且不想显式地写出字典。
我使用了以下代码
Lookup= Lookup.set_index('Variable')
dic = Lookup.to_dict('dict')
和
dic = dict(zip(Lookup['Variable'].tolist(), Lookup['Type'].tolist()))
,但是最终都遇到将字典中的“ Type”放在引号中的相同问题,例如“ np.uint16”而不是np.uint16
这意味着当我运行read_csv时:
df = pd.read_csv("input.csv", nrows=100, dtype=dic)
我收到错误“ TypeError:数据类型“ np.uint16”无法理解”
如何制作一个包含来自pandas数据框的变量和数据类型的字典,然后可以在read_csv语句内部使用它而不会出错?
“ input.csv”的行长为100M +行,宽度为250+列,因此,所有这些目标是使pandas数据帧占用尽可能少的内存,同时仍保持精度。
答案 0 :(得分:1)
我可以想到两种方法。
一种方法是使用dict
映射,如下所示:
dtype_mapping = {'np.uint8': np.uint8,
'np.uint16': np.uint16,
...all your dtypes here...
'object': 'np.object'}
dtypes = [dtype_mapping[dtype] for dtype in Lookup['Type']]
dic = dict(zip(Lookup['Variable'].tolist(), dtypes)
...然后您从那里继续。
第二个(需要较少的输入,但由于允许任意代码执行,所以我发现它有点狡猾),是求值:
dtypes = [eval(dtype) for dtype in Lookup['Type']]
dic = dict(zip(Lookup['Variable'].tolist(), dtypes))
答案 1 :(得分:1)
如果这是您的文件test.csv
Name1;Number1;Number2;Name2
a;2;3.0;b
然后您可以定义类型系列
types = pd.Series(data=['object', 'float', 'float', 'object'], index=['Name1', 'Number1', 'Number2', 'Name2'])
types = types.apply(eval)
并使用它读取您的数据:
df = pd.read_csv('test.csv', sep=';', dtype=types.to_dict())