【问题标题】:Pandas read_csv dtype specify all columns but onePandas read_csv dtype 指定除一列之外的所有列
【发布时间】:2016-09-27 16:57:57
【问题描述】:

我有一个 CSV 文件。大多数值我想读取为字符串,但如果具有给定标题的列存在,我想将列读取为布尔值..

因为 CSV 文件有很多列,所以我不想直接在每一列上指定数据类型并给出如下内容:

data = read_csv('sample.csv', dtype={'A': str, 'B': str, ..., 'X': bool})

是否可以在除一个之外的每一列上定义字符串类型并同时将可选列读取为布尔值?

我目前的解决方案如下(但效率很低而且很慢):

data = read_csv('sample.csv', dtype=str) # reads all column as string
if 'X' in data.columns:
    l = lambda row: True if row['X'] == 'True' else False if row['X'] == 'False' else None
    data['X'] = data.apply(l, axis=1)

更新: CSV 示例:

A;B;C;X
a1;b1;c1;True
a2;b2;c2;False
a3;b3;c3;True

或者同样可以没有'X'列(因为该列是可选的):

A;B;C
a1;b1;c1
a2;b2;c2
a3;b3;c3

【问题讨论】:

    标签: python csv pandas dataframe


    【解决方案1】:

    您可以先用boolean indexing 过滤列containsX,然后再过滤replace

    cols = df.columns[df.columns.str.contains('X')]
    df[cols] = df[cols].replace({'True': True, 'False': False})
    

    或者如果需要过滤栏X:

    cols = df.columns[df.columns == 'X']
    df[cols] = df[cols].replace({'True': True, 'False': False})
    

    示例:

    import pandas as pd
    
    df = pd.DataFrame({'A':['a1','a2','a3'],
                       'B':['b1','b2','b3'],
                       'C':['c1','c2','c3'],
                       'X':['True','False','True']})
    
    print (df)
        A   B   C      X
    0  a1  b1  c1   True
    1  a2  b2  c2  False
    2  a3  b3  c3   True
    
    print (df.dtypes)
    A    object
    B    object
    C    object
    X    object
    dtype: object
    
    cols = df.columns[df.columns.str.contains('X')]
    print (cols)
    
    Index(['X'], dtype='object')
    
    df[cols] = df[cols].replace({'True': True, 'False': False})
    
    print (df.dtypes)
    A    object
    B    object
    C    object
    X      bool
    dtype: object
    print (df)
    
        A   B   C      X
    0  a1  b1  c1   True
    1  a2  b2  c2  False
    2  a3  b3  c3   True
    

    【讨论】:

    • 谢谢!它比我的解决方案快得多!
    • 那个解决方案有一个非常大的问题..它将False值设置为True值..任何长度不为零的字符串都被解析为True..
    【解决方案2】:

    为什么不使用bool() 数据类型。 bool() 如果传递了一个参数并且该参数不是 False、None、'' 或 0,则计算结果为 true

    if 'X' in data.columns:
        try:
            l = bool(data.columns['X'].replace('False', 0))
        except:
            l = None
        data['X'] = data.apply(l, axis=1)
    

    【讨论】:

    • 我认为应用 lambda 表达式会减慢处理时间。
    • 绝对是的。如果我要按照您最初的方式处理它,那么我将使用 if/else 语句。 if data == 'False': l = False elif data == 'True': l = True else: l = None 但我会使用提供的答案。假设您有一个大型数据集,我会为这两种解决方案计时并以最快的速度使用。祝你好运
    【解决方案3】:

    实际上,使用 pandas 中的 read_csv 时不需要任何特殊处理(在 0.17 版上测试)。将您的示例文件与 X 一起使用:

    import pandas as pd
    
    df = pd.read_csv("file.csv", delimiter=";")
    print(df.dtypes)
    
    A    object
    B    object
    C    object
    X      bool
    dtype: object
    

    【讨论】:

    • 默认情况下我不需要它,但我的数据非常特殊(它混合了字母数字)。这就是为什么我对某些列有此限制以将特殊数字保留为字符串格式的原因之一。
    【解决方案4】:

    对于那些在标题中寻找问题答案的人,(在这种情况下,将所有设置为字符串,除了索引为 int),如果您知道您拥有的列数,您可以执行以下操作:

    dtype = dict(zip(range(9),np.int16 + [str for _ in range(8)]))
    dframe = pd.read_csv('../files/file.csv', dtype=dtype)
    

    归功于Anton vBR in this question

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 2019-11-30
      • 1970-01-01
      • 2020-07-22
      • 2020-07-26
      • 2018-09-16
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多