熊猫read_csv声明dtype导致列错误

时间:2020-04-13 13:22:00

标签: python pandas data-science

当我使用熊猫读取csv文件时,为了节省内存,我通过使用字典(dtype)来设置dict_types

dict_types = {
    "Id": "object",
    "COD_OPE": "object",
    "NUM_OPE": "float32",
    "STR_ANA": "category",
    "COD_EXO": "category",
    "NUM_CPT": "object",
    "MTT_DEV": "float32",
    "SEN_MTT": "category",
}
columns = [
    "Id",
    "COD_OPE",
    "NUM_OPE",
    "STR_ANA",
    "COD_EXO",
    "NUM_CPT",
    "MTT_DEV",
    "SEN_MTT",
    "DTE_OPE", 
    "DTE_CPT",
    "DTE_VAL", 
    "DTE_TRT"
]
df_chunk = pd.read_csv(
    "../SIDP_Operations/SAB_OPE_02_2020/SAB_OPE_02_2020.rpt",
    sep="\t",
    dtype=dict_types,
    usecols=columns,
    error_bad_lines=False,
    chunksize=1000000,
    parse_dates=["DTE_OPE", "DTE_CPT", "DTE_VAL", "DTE_TRT"],
    infer_datetime_format=True,
)

但是,当加载文件并查看df.info()df.dtypes时,它告诉我STR_ANA的类型为object,而我希望它应该是category。 “ COD_EXO”,“ SEN_MTT”的类型确实为category

为什么?

也许是因为我使用块的方式? 实际上,我这样做是为了读取数据框

chunk_list=[] 
for chunk in df_chunk: 
    chunk_list.append(chunk) 
df=pd.concat(chunk_list,ignore_index=True)

1 个答案:

答案 0 :(得分:1)

可以使用pd.concat(),但最好添加ignore_index=True以避免索引重复。

df = pd.concat(df_chunk, ignore_index=True)

您已经为parse_dates中不存在的参数columns填写了4列。

确保csv文件中的列名与您要分配的dtypesusecols的名称相同。可以肯定的是,请使用参数header=N确保大熊猫使用csv的N行作为标题。

尝试一下:

# add 4 columns with date
columns = [
    "Id",
    "COD_OPE",
    "NUM_OPE",
    "STR_ANA",
    "COD_EXO",
    "NUM_CPT",
    "MTT_DEV",
    "SEN_MTT",
    "DTE_OPE", "DTE_CPT", "DTE_VAL", "DTE_TRT"
]
df_chunk = pd.read_csv(
    "../SIDP_Operations/SAB_OPE_02_2020/SAB_OPE_02_2020.rpt",
    sep="\t",
    header=0,
    usecols=columns,
    dtype=dict_types,
    parse_dates=["DTE_OPE", "DTE_CPT", "DTE_VAL", "DTE_TRT"],
    infer_datetime_format=True,
    chunksize=1000000,
    error_bad_lines=False,
    low_memory=False
)

如果仍然无法正常工作,请尝试移除low_memory=False