Pandas read_csv dtype读取所有列,但很少读取字符串

时间:2018-04-06 03:45:37

标签: python pandas csv

我正在使用Pandas来阅读一堆CSV。将选项json传递给dtype参数以告诉pandas将哪些列读取为字符串而不是默认值:

dtype_dic= { 'service_id':str, 'end_date':str, ... }
feedArray = pd.read_csv(feedfile , dtype = dtype_dic)

在我的方案中, 所有 除了一些特定的列之外的列将被读取为字符串。因此,我不想在dtype_dic中将多个列定义为str,而是将我选择的几个列设置为int或float。有没有办法做到这一点?

循环遍历具有不同列的各种CSV,因此在将整个csv作为字符串(dtype=str)读取后进行直接列转换并不容易,因为我不会立即知道哪些列csv有。 (我宁愿花费精力来定义dtype json中的所有列!)

编辑:但是,如果有一种方法可以处理要转换为数字的列名列表而不会错误输出,如果该列不存在于该csv中,那么是的,那将是一个' ll有效的解决方案,如果在csv阅读阶段本身无法做到这一点。

注意:这听起来like a previously asked question但是那里的答案走的是一条非常不同的路径(bool相关),这并不适用于这个问题。请不要标记为重复!

2 个答案:

答案 0 :(得分:18)

编辑 - 对不起,我误解了你的问题。更新了我的答案。

您可以将整个csv作为字符串读取,然后将您想要的列转换为其他类型,如下所示:

df = pd.read_csv('/path/to/file.csv', dtype=str)
# example df; yours will be from pd.read_csv() above
df = pd.DataFrame({'A': ['1', '3', '5'], 'B': ['2', '4', '6'], 'C': ['x', 'y', 'z']})
types_dict = {'A': int, 'B': float}
for col, col_type in types_dict.items():
    df[col] = df[col].astype(col_type)

另一种方法,如果你真的想在读取文件时为所有列指定正确的类型而不是在之后更改它们:只读入列名(没有行),然后使用它们填写哪些列应该是字符串

col_names = pd.read_csv('file.csv', nrows=0).columns
types_dict = {'A': int, 'B': float}
types_dict.update({col: str for col in col_names if col not in types_dict})
pd.read_csv('file.csv', dtype=types_dict)

答案 1 :(得分:17)

我最近遇到了同样的问题,虽然我只有一个 csv 文件,所以我不需要遍历文件。我认为这个解决方案也可以改编成一个循环。

这里我介绍一个我使用的解决方案。 Pandas 的 read_csv 有一个名为 converters 的参数,它覆盖了 dtype,因此您可以利用此功能。

示例代码如下: 假设我们的 data.csv 文件包含除 AB 之外的所有 float64 列,它们是字符串列。您可以使用以下方式阅读此文件:

df = pd.read_csv('data.csv', dtype = 'float64', converters = {'A': str, 'B': str})  

代码给出警告,转换器覆盖 A 和 B 这两列的 dtypes,结果如预期。

关于循环遍历多个 csv 文件,我们需要做的就是找出哪些列将成为例外,可以放入转换器。如果文件具有相似的列名模式,这很容易,否则会变得乏味。