【问题标题】:Pandas read_csv, reading a boolean with missing values specified as an intPandas read_csv,读取缺失值指定为 int 的布尔值
【发布时间】:2017-05-09 07:55:01
【问题描述】:

我正在尝试将 csv 导入 pandas 数据框。我有用 1 和 0 表示的布尔变量,其中缺失值用 -9 标识。 当我尝试将 dtype 指定为布尔值时,会收到许多不同的错误,具体取决于我的尝试。

样本数据:test.csv

var1, var2
0,   0
0,   1
1,   3
-9,  0
0,   2
1,   7

我尝试在导入时指定 dtype:

dtype_dict = {'var1':'bool','var2':'int'}
nan_dict = {'var1':[-9]}
foo = pd.read_csv('test.csv',dtype=dtype_dict, na_values=nan_dict)

我收到以下错误:

ValueError: 无法安全地将传递的 |b1 的用户 dtype 转换为 int64 第 0 列中的 dtyped 数据

我也试过指定真假值,

foo = pd.read_csv('test.csv',dtype=dtype_dict,na_values=nan_dict,
                 true_values=[1],false_values=[0])

然后我得到一个不同的错误:

例外:必须是所有编码字节

错误的源代码说明了捕获偶尔的无,但无或空值正是我想要的。

【问题讨论】:

    标签: python csv pandas boolean missing-data


    【解决方案1】:

    您可以为var1 列指定converters 参数:

    from io import StringIO
    import numpy as np
    import pandas as pd
    
    pd.read_csv(StringIO("""var1, var2
    0,   0
    0,   1
    1,   3
    -9,  0
    0,   2
    1,   7"""), converters = {'var1': lambda x: bool(int(x)) if x != '-9' else np.nan})
    

    【讨论】:

      【解决方案2】:

      你可以这样做吗?

      df=pd.read_csv("test.csv",names=["var1","var2"])
      df.ix[df.var1==0,'var1Bool']=False
      df.ix[df.var1==1,'var1Bool']=True
      

      这应该会为您创建一个新列,如果您满意,您可以复制旧列。

         var1  var2 var1Bool
      0     0     0    False
      1     0     1    False
      2     1     3     True
      3    -9     0      NaN
      4     0     2    False
      5     1     7     True
      

      【讨论】:

      • 谢谢。理想情况下,我希望在导入时执行此操作,因为数据有点大,但这是一个很好的解决方法。
      • 我还想了解我在导入时遇到了什么问题以及为什么它不起作用。但是,如果我在接下来的几个小时内没有获得更多见解,我会将其标记为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 2012-02-25
      • 2017-02-10
      相关资源
      最近更新 更多