当has_header=False时,如何读取Polars DataFrame的列子集?
解决Polars读取CSV时指定列子集的报错问题
当你设置has_header=False时,Polars会自动生成以column_开头的临时列名,而你通过columns参数传入自定义列名时,Polars会尝试匹配这些临时列名,导致冲突报错。以下两种方法可以解决这个问题:
方法一:先读取全量列,再选择目标子集
先正常读取所有列(此时dtypes里的列名会被正确应用),之后用.select()方法筛选需要的列:
vcf = pl.read_csv( vcf_path, comment_prefix='#', has_header=False, separator='\t', dtypes=dtype_options, ).select(list_of_columns)
这种方法简单直接,适合数据量不大的场景,不需要额外处理列索引。
方法二:通过列索引指定读取范围,再重命名列
如果数据量较大,不想读取全量列,可以先确定目标列在原文件中的索引位置,用索引指定columns参数,再通过new_columns重命名为自定义列名:
# 假设list_of_columns对应原文件的第0、2、5列,替换为你的实际列索引 column_indices = [0, 2, 5] # 只保留目标列的类型定义 target_dtypes = {col: dtype_options[col] for col in list_of_columns} vcf = pl.read_csv( vcf_path, comment_prefix='#', has_header=False, separator='\t', columns=column_indices, dtypes=target_dtypes, new_columns=list_of_columns )
这种方法避免读取全量数据,适合处理大文件。
报错原因说明
当has_header=False时,Polars在读取阶段还未应用dtypes中的自定义列名,此时columns参数只能匹配Polars自动生成的column_0、column_1等临时列名,传入自定义列名就会触发ValueError。
内容的提问来源于stack exchange,提问作者Míriam
相关产品推荐
相关产品推荐

