【问题标题】:Pandas read_csv declaration dtype convets column incorrectlyPandas read_csv 声明 dtype 错误地转换列
【发布时间】:2020-07-26 01:37:46
【问题描述】:

当我使用 pandas 读取 csv 文件时,我使用字典 (dict_types) 设置 dtype 以节省内存:

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 的方式? 实际上我这样做是为了读取数据帧

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

【问题讨论】:

  • 您是否尝试在导入数据后使用df_chunk['STR_ANA'] = df_chunk['STR_ANA'].astype('category') 手动转换?
  • df_chunk.dtypes() 的输出是什么?
  • 是的,使用df_chunk['STR_ANA'] = df_chunk['STR_ANA'].astype('category') 会起作用,但我想做的是在开始读取数据时节省内存,因为我的电脑读取所有数据太差了.. .
  • df_chunk.dtypes() 也是冒号“STR_ANA”和其他应该属于类别的冒号的对象...

标签: python pandas data-science


【解决方案1】:

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

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

您已为parse_dates 参数填写了4 列,这些参数在columns 中不存在。

确保 csv 文件中的列名与您分配的 dtypesusecols 的名称相同。可以肯定的是,使用参数header=N 来确保pandas 使用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

【讨论】:

  • 你好,其实我做了chunk_list=[]for chunk in df_chunk: chunk_list.append(chunk)df=pd.concat(chunk_list),这个和get_chunk()有区别吗?
  • 请尝试解决方案 v2。
  • 非常感谢!我已经尝试了所有这些,但不幸的是这对我不起作用......这真的很糟糕
猜你喜欢
  • 2019-11-30
  • 2016-11-02
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多