为 pandas.read_csv 指定正确的 dtypes 以获取日期时间和布尔值

Posted

技术标签:

【中文标题】为 pandas.read_csv 指定正确的 dtypes 以获取日期时间和布尔值【英文标题】:Specify correct dtypes to pandas.read_csv for datetimes and booleans 【发布时间】:2013-12-04 10:45:21 【问题描述】:

我正在将 csv 文件加载到 Pandas DataFrame 中。对于每一列,如何使用dtype 参数指定它包含的数据类型?

我可以用 numeric 数据(代码在底部)来做到这一点... 但是如何指定时间数据... 和分类数据,例如因子或布尔值?我试过np.bool_pd.tslib.Timestamp 都没有运气。

代码:

import pandas as pd
import numpy as np
df = pd.read_csv(<file-name>, dtype='A': np.int64, 'B': np.float64)

【问题讨论】:

查看 date_parser-arguments here。关于布尔值:您的数据如何存储? NumPy Docs 状态 np.bool_ 用于存储为字节的布尔值(也许您正在使用字符串?) 【参考方案1】:

read_csv 有很多选项可以处理您提到的所有情况。您可能想尝试 dtype='A': datetime.datetime,但通常不需要 dtype,因为 pandas 可以推断类型。

对于日期,则需要指定 parse_date 选项

parse_dates : boolean, list of ints or names, list of lists, or dict
keep_date_col : boolean, default False
date_parser : function

一般来说,要转换布尔值,您需要指定:

true_values  : list  Values to consider as True
false_values : list  Values to consider as False

这会将列表中的任何值转换为布尔值 true/false。对于更一般的转换,您很可能需要

转换器:字典。用于转换某些列中的值的可选函数字典。键可以是整数或列标签

虽然很密集,但请在此处查看完整列表:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

【讨论】:

不知道转换器。会调查的。但是指定为整数的类别呢?在我的例子中,我有很多这些特征,因为它们既不是序数、间隔或比率,所以能够将它们指定为名义(分类)是很好的。 如果分类数据是字符串,则将它们保留为字符串并在读取 DataFrame 后转换为整数(或者您可以使用转换器转换特定列)。如果您有类似 int 的类别,那么您不能将它们作为 int 数据类型读入吗? 数据是整数,但它们应该被视为类别。否则许多机器学习模型会以错误的方式使用这些功能。 我跟着你。我的评论是您可以在阅读 CSV 文件时进行转换,也可以在拥有 DataFrame 后进行转换。我个人认为后者更容易一些。阅读数据框后,假设您要将“A”列设为分类。有一点映射: def MapA(int1): if int1==0: return 'category1' elif int1==1: return 'category2' etc... 并创建一个新的分类数据列

以上是关于为 pandas.read_csv 指定正确的 dtypes 以获取日期时间和布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas read_csv:正确解析时间字段

pandas.read_csv 将字符串转换为科学记数法中的“数字”(我不想要)

Python Pandas——Read_csv详解

pandas read_csv 列 dtype 设置为十进制但转换为字符串

为啥在指定编码 utf-8 时 pandas read_csv 会出现 unicode 错误? [复制]

大 TSV 文件中主要为整数的字符串列的不一致 pandas read_csv dtype 推断