如何将pandas DataFrame的None按字段类型替换后上传至AWS S3
解决方案
你代码中df=df.applymap(str)会把pandas原生的缺失值(None、np.nan、pd.NA)强制转换为字面量字符串'None',导致后续to_csv方法无法识别这些值为缺失值,会直接输出None字符串。你可以根据业务场景选择以下两种修改方案:
场景1:INT类型空值替换为0,VARCHAR类型空值替换为空字符串
直接删除df.applymap(str)这行,调整后的完整代码如下:
import pyodbc import pandas as pd import boto3 from io import BytesIO, TextIOWrapper import gzip connection = pyodbc.connect(conn) sql = 'SELECT id, name from table_a' df = pd.read_sql_query(sql, connection) # 处理INT类型字段id的空值为0,不需要转0可以删除这行 df['id'] = df['id'].fillna(0).astype('Int64') csv_buffer = BytesIO() s3 = boto3.resource('s3') with gzip.GzipFile(mode='w', fileobj=csv_buffer) as zipped_file: # na_rep参数指定缺失值输出为空字符串,要输出NULL直接改为na_rep='NULL' df.to_csv(TextIOWrapper(zipped_file, 'utf8'), index=False, na_rep='') s3.Object(bucket[env],dest_filename).put(Body=csv_buffer.getvalue())
场景2:必须保留所有字段转字符串的逻辑
如果你的业务要求所有字段最终都要输出字符串类型,可以先替换所有'None'字符串为缺失值,再导出:
connection = pyodbc.connect(conn) sql = 'SELECT id, name from table_a' df = pd.read_sql_query(sql, connection) df=df.applymap(str) # 替换所有值为'None'的单元格为pandas缺失值 df = df.replace('None', pd.NA) csv_buffer = BytesIO() s3 = boto3.resource('s3') with gzip.GzipFile(mode='w', fileobj=csv_buffer) as zipped_file: df.to_csv(TextIOWrapper(zipped_file, 'utf8'), index=False, na_rep='') s3.Object(bucket[env],dest_filename).put(Body=csv_buffer.getvalue())
内容的提问来源于stack exchange,提问作者vvazza
相关产品推荐
相关产品推荐

