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

Nik*_* VJ 26 python csv pandas

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

dtype_dic= { 'service_id':str, 'end_date':str, ... }
feedArray = pd.read_csv(feedfile , dtype = dtype_dic)
Run Code Online (Sandbox Code Playgroud)

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

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

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

注意:这听起来像一个先前提出的问题,但那里的答案走了一条非常不同的路径(bool相关),这不适用于这个问题.请不要标记为重复!

Nat*_*han 35

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

您可以将整个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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

  • 小心,第一个解决方案将输出空列,因为“NA”浮点数而不是“str”,尽管显式“dtype=str”。添加 `keep_default_na=False` 可以修复此问题,以便所有内容都_真正_首先作为 str 读入。 (2认同)

小智 21

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

在这里,我提出了一个我使用的解决方案。Pandasread_csv有一个名为converterswhich overrides的参数dtype,因此您可以利用此功能。

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

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

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

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

  • 您可以只为一列或多列指定转换器,而无需为其他列指定 dtype。当您只有几列需要指定格式,并且您不想像上面的答案那样为所有列指定格式时,它非常有用。 (2认同)

Sha*_*oui 7

您可以执行以下操作:

pd.read_csv(self._LOCAL_FILE_PATH,
            index_col=0,
             encoding="utf-8",
             dtype={
                    'customer_id': 'int32',
                    'product_id': 'int32',
                    'subcategory_id': 'int16',
                    'category_id': 'int16',
                    'gender': 'int8',
                    'views': 'int8',
                    'purchased': 'int8',
                    'added': 'int8',
                    'time_on_page': 'float16',
                 })
Run Code Online (Sandbox Code Playgroud)