如何从值是数据类型的pandas数据框中创建字典?

时间:2019-02-19 09:58:43

标签: python-3.x pandas dataframe dictionary types

我有一个名为“ 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数据帧占用尽可能少的内存,同时仍保持精度。

2 个答案:

答案 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())