使用Pandas从S3读取CSV文件时无法正确识别列名
解决从S3读取鸢尾花数据集时列名被识别为数据行的问题
方案1:让Pandas直接处理S3路径(推荐)
无需手动创建s3fs.S3FileSystem对象,Pandas可直接读取S3路径(前提是环境已安装s3fs库)。这种方式会自动处理文件流解析,避免手动打开文件时的编码或模式问题:
import pandas as pd s3_path = 's3://h2o-public-test-data/smalldata/iris/iris.csv' df = pd.read_csv(s3_path, storage_options={'anon': True}, header=0)
方案2:修正s3fs.open的打开模式
如果坚持手动使用s3fs打开文件,需确保以文本模式而非二进制模式打开,并指定编码,同时显式设置header=0(功能等价于header=True,但语义更明确):
import pandas as pd import s3fs s3_path = 's3://h2o-public-test-data/smalldata/iris/iris.csv' s3 = s3fs.S3FileSystem(anon=True) with s3.open(s3_path, 'r', encoding='utf-8') as f: df = pd.read_csv(f, header=0)
方案3:手动指定列名(若数据集无内置列名)
如果目标CSV本身没有列名行(鸢尾花原始数据集通常只有数据、无列名),可手动定义列名并传入names参数,此时Pandas会将第一行内容识别为数据:
import pandas as pd import s3fs s3_path = 's3://h2o-public-test-data/smalldata/iris/iris.csv' column_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'] s3 = s3fs.S3FileSystem(anon=True) with s3.open(s3_path, 'r', encoding='utf-8') as f: df = pd.read_csv(f, names=column_names)
问题原因
这类问题大概率是因为手动以二进制模式(rb)打开文件时,Pandas解析文本内容出现异常,导致无法正确识别列名行。改用文本模式打开或让Pandas直接处理S3路径,均可避免这类解析问题。
内容的提问来源于stack exchange,提问作者Muhammad Kamil
相关产品推荐
相关产品推荐

