避免 pandas 将 0,1 转换为 True 和 False
Posted
技术标签:
【中文标题】避免 pandas 将 0,1 转换为 True 和 False【英文标题】:Avoid pandas converting 0,1 to True and False 【发布时间】:2020-11-25 16:16:00 【问题描述】:我对熊猫还很陌生。我正在从文件夹中读取 sql 文件列表,然后使用 df.to_csv 将输出写入文本文件,然后使用这些文件使用 COPY 命令上传到 redshift。 我遇到的一个问题是一些布尔列(1,0)正在转换为 True/False,这是我不想要的,因为 Redshift 副本会引发错误。 这是我的代码
for filename in glob.glob('*.sql'):
with open(filename, 'r') as f:
df = pd.read_sql_query(f.read(),conn)
df['source_file_name'] = output_file_name
df.to_csv(output_file, sep='\t', index=False, float_format="%.11g")
f.close()
我不想将逻辑中的特定列名提供给 .astype(int),因为我正在处理大约 100 个具有不同输出列和不同数据类型的文件。 df *1 也不起作用,因为它给出了日期时间列的错误。有解决方案吗?我什至可以在 df.to_csv 进行操作。
【问题讨论】:
所以你只遇到布尔列的问题?那是对的吗?要将 True 和 False 分别转换为 1 和 0? @Gusto,是的,这正是我想要的。 【参考方案1】:我不确定这是否是最有效的解决方案,但您可以检查每列的类型,如果它是布尔类型,您可以使用 sklearn 的 LabelEncoder 对标签进行编码
例如:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for i, type_ in enumerate(df.dtypes):
if type_ == 'bool':
df.iloc[:,i] = le.fit_transform(df.iloc[:,i])
只需在 for 循环中添加此代码 sn-p,然后将其保存为 csv。
【讨论】:
【参考方案2】:我发现这行得通。 Gusto 的回答让我意识到玩 iloc 并想出了这个解决方案。
for filename in glob.glob('*.sql'):
with open(filename, 'r') as f:
df = pd.read_sql_query(f.read(),conn)
df['source_file_name'] = output_file_name
for i, type_ in enumerate(df.dtypes):
if type_ == 'bool':
df = df.convert_dtypes(convert_boolean=False)
df.to_csv(output_file, sep='\t', index=False, float_format="%.11g")
f.close()
【讨论】:
以上是关于避免 pandas 将 0,1 转换为 True 和 False的主要内容,如果未能解决你的问题,请参考以下文章