使用预先指定的 dtype 将文件加载到 pandas 数据帧中,并将"DIV0"字符串替换为 nan



我正在尝试找到将大型(>10 GB)文件加载到熊猫数据帧中的方法。 这目前需要几分钟,可能是由于熊猫dtype检测。 为了使此操作更快,并理想地减少内存占用,我想预先指定文件中每一列的数据类型。 我试图通过加载文件并记录熊猫分配的 dtypes 来做到这一点,但该文件包含一些需要替换的 DIV0 值:

df = pd.read_csv(data_path + data_file_name, index_col = None)
dtype_df = pd.DataFrame(df.dtypes)
dtype_dict = dtype_df.to_dict()[0]

dtype_dict
> {'CEO_Comp': dtype('float64'),  'aq_accounts_payable':
> dtype('float64'),  'aq_accounts_payable_ranked':
> dtype('float64'),  'aq_accounts_receivable': dtype('float64'), 
> 'aq_accounts_receivable_ranked': dtype('float64'), ...
df2 = pd.read_csv(data_path + data_file_name, index_col = None, dtype = dtype_dict)

。 值错误: 无法将字符串转换为浮点数: 'DIV0'

不幸的是,某些字段似乎仍然包含一个字符串,例如"DIV0"。 如何在加载时处理这些? 是否无论如何在读取文件时将这些视为包含nan,还是我必须进行预处理?

其次,我可以用 float32 和 int32 替换所有 float64 和 int64 dtype 吗? 我不需要 64 位精度,并且认为这可以显着降低内存和性能开销?

除了 Milouga 下面给出的答案,如果其他人有类似的问题,我继续使用以下代码将 dtype 从 64 位更改为 32 位,将 dtype 字典保存为泡菜,然后重新加载,将来每次都将 csv 加载为 32 位:

import pickle
dtype_df = pd.DataFrame(df.dtypes)
dtype_df.replace(['float64', 'int64'], ['float32', 'int32'], inplace = True)
dtype_dict = dtype_df.to_dict()[0]
# Pickle dict
with open(data_path + 'monthlies/' + 'dtype_dict.pkl', 'wb') as handle:
pickle.dump(dtype_dict, handle, protocol=pickle.HIGHEST_PROTOCOL) 
# Load dict
with open(data_path + 'dtype_dict.pkl', 'rb') as handle:
dtype_dict = pickle.load(handle)

然后使用以下方法重新加载:

df = pd.read_csv(data_file, index_col = None, na_values = 'DIV0', dtype = dtype_dict, encoding='iso-8859-1')  

还可以使用usecols = ['date', 'column_a', 'column_b' ...] etc.in read_csv

使用函数的参数na_valuesread_csv。从文档:

na_values:标量、str、类似列表或字典,默认无

要识别为 NA/NaN 的其他字符串。如果字典通过,则特定的每列 NA 值。默认情况下,以下值被解释为

NaN:", '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN', '-NaN', '-nan', '1.#IND', '1.#QNAN', 'N/A', 'NA', 'NULL', 'NaN', 'nan''。

关于你的第二个问题,你可以在你创建的dtype字典中用float32和int32替换dtype。

相关内容

最新更新