我有以下问题。我想阅读一个具有300万行和多列列的大型csv。我想向下转换列的dtypes。我的方法是读取csv,然后使用pd.to_numeric()
向下转换。我不知道列数及其类型。在读取csv时是否有可能向下转换,因此我不必两次触摸数据框?
我目前的做法是:
import pandas as pd
df = pd.read_csv(filePath, delimiter=delimiter, memory_map=True,engine='c', low_memory=True)
for column in df:
if is_numeric_dtype(df[column]):
df[column] = pd.to_numeric(df[column], downcast='signed')
df[column] = pd.to_numeric(df[column], downcast='float')
谢谢!
答案 0 :(得分:1)
如果有人遇到相同的问题,您可以轻松地读第一行,计算dtype并将其映射为首选dtype,并在读取整个文件时将其用作dtype参数:
示例:
import pandas as pd
df = pd.read_csv(filePath, delimiter=delimiter, nrows=2, low_memory=True, memory_map=True,engine='c')
mapdtypes = {'int64': 'int8', 'float64': 'float32'}
dtypes = list(df.dtypes.apply(str).replace(mapdtypes))
dtype = {key: value for (key, value) in enumerate(dtypes)}
df = pd.read_csv(filePath, delimiter=delimiter, memory_map=True,engine='c', low_memory=True, dtype=dtype)