当我使用熊猫读取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)
答案 0 :(得分:1)
可以使用pd.concat(),但最好添加ignore_index=True
以避免索引重复。
df = pd.concat(df_chunk, ignore_index=True)
您已经为parse_dates
中不存在的参数columns
填写了4列。
确保csv文件中的列名与您要分配的dtypes
和usecols
的名称相同。可以肯定的是,请使用参数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
。