首页 文章

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

提问于
浏览
4

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

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

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

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

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

注意:这听起来像like a previously asked question,但那里的答案走了一条非常不同的路径(bool相关),它没有标记为重复!

1 回答

  • 9

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

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

相关问题