【问题标题】:Avoid pandas converting 0,1 to True and False避免 pandas 将 0,1 转换为 True 和 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,是的,这正是我想要的。

标签: python pandas amazon-redshift


【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-17
      • 2019-01-14
      • 2020-07-06
      • 2019-11-04
      • 2011-12-16
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多