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

新手上路,请多包涵

我正在使用 Pandas 读取一堆 CSV。将 options 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 中不存在该列时出错,那么是的,如果没有其他方法,那将是一个有效的解决方案这在 csv 阅读阶段本身。

注意:这听起来 像是一个以前问过的问题,但那里的答案却走上了一条非常不同的道路(与 bool 相关),这不适用于这个问题。请不要标记为重复!

原文由 Nikhil VJ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

编辑 - 抱歉,我误读了你的问题。更新了我的答案。

您可以将整个 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)

原文由 Nathan 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

这里我介绍一个我用过的解决方案。 Pandas 的 read_csv 有一个名为 converters 的参数,它覆盖了 dtype ,所以你可以利用这个特性。

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

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

该代码给出了转换器覆盖 A 和 B 这两列的 dtype 的警告,并且结果符合预期。

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

原文由 MECoskun 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题