避免 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的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 映射到 TRUE/FALSE 作为字符串,而不是布尔值

将 pandas.groupby 转换为 dict

将Pandas数据帧转换为Spark数据帧错误

如何将Pandas中的非零条目转换为带有列表的dict?

如何将“false”转换为 0,将“true”转换为 1?

将 UTC 日期时间转换为 pandas 中的本地日期时间