Python 3.x 如何从值为数据类型的数据帧生成字典?

Python 3.x 如何从值为数据类型的数据帧生成字典?,python-3.x,pandas,dataframe,dictionary,types,Python 3.x,Pandas,Dataframe,Dictionary,Types,我有一个名为“Lookup”的数据帧,看起来像这样: | Variable | Type 0 | Var1 | object 1 | Var2 | np.uint16 我想用它来创建一个字典来导入一个大的csv,以保持低内存大小 大csv太大,无法使用pd.read\u csv的low\u memory=False选项 我可以在以后更改数据类型或手动键入所有变量,但我有200多个变量,不想显式地写出字典 我使用了以下代码 Lookup= Lookup.set_inde

我有一个名为“Lookup”的数据帧,看起来像这样:

   | Variable | Type
0  | Var1     | object
1  | Var2     | np.uint16
我想用它来创建一个字典来导入一个大的csv,以保持低内存大小

大csv太大,无法使用pd.read\u csv的low\u memory=False选项

我可以在以后更改数据类型或手动键入所有变量,但我有200多个变量,不想显式地写出字典

我使用了以下代码

Lookup= Lookup.set_index('Variable')
dic = Lookup.to_dict('dict')

但两者最终都会遇到同样的问题,即在字典中的引号中加上“Type”,例如“np.uint16”而不是np.uint16

这意味着当我运行read_csv时:

df = pd.read_csv("input.csv", nrows=100, dtype=dic)
我得到错误“TypeError:data type”np.uint16“未理解”

如何从pandas数据框中创建包含变量和数据类型的字典,然后在read_csv语句中使用该字典而不会出错


注意,“input.csv”的行数超过100M,列数超过250,因此所有这些的目的都是在保持精度的同时,使pandas数据帧占用尽可能少的内存

我可以想到两种方法

一种是使用
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))

我可以想到两种方法

一种是使用
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))

如果这是您的文件
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())

如果这是您的文件
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())

太好了,谢谢你。你的第一个答案已经成功了:-)@RichardKapustynskyj如果我的答案对你有帮助,请接受它!太好了,谢谢你。你的第一个答案已经成功了:-)@RichardKapustynskyj如果我的答案对你有帮助,请接受它!