代码之家  ›  专栏  ›  技术社区  ›  piripiri

如何将pandas中的空字符串视为普通字符串?

  •  28
  • piripiri  · 技术社区  · 7 年前

    我有一个csv文件,它有一个带字符串的列,我想用pandas来读取它。在这个文件中 null 作为实际值发生,不应视为缺少值。

    例子:

    import pandas as pd
    from io import StringIO
    
    data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
    print(pd.read_csv(StringIO(data)))
    

    这将提供以下输出:

      strings  numbers
    0     foo        1
    1     bar        2
    2     NaN        3
    

    我能做什么来获得价值 无效的 它是(而不是NaN)进入数据帧的吗?可以假定该文件不包含任何实际丢失的值。

    4 回复  |  直到 6 年前
        1
  •  29
  •   cs95 abhishek58g    7 年前

    您可以指定 converters 论证 string 列。

    pd.read_csv(StringIO(data), converters={'strings' : str})
    
      strings  numbers
    0     foo        1
    1     bar        2
    2    null        3
    

    这将通过熊猫的自动解析。


    另一个选择是设置 na_filter=False :

    pd.read_csv(StringIO(data), na_filter=False)
    
      strings  numbers
    0     foo        1
    1     bar        2
    2    null        3
    

    这适用于整个数据帧,因此请谨慎使用。如果您希望通过外科手术将此应用于选择列,我建议使用第一个选项。

        2
  •  15
  •   EdChum Arthur G    7 年前

    发生这种情况的原因是 'null' 被视为 NaN 在解析时,可以通过传递 keep_default_na=False 除了@coldspeed的回答:

    In[49]:
    data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
    df = pd.read_csv(io.StringIO(data), keep_default_na=False)
    df
    
    Out[49]: 
      strings  numbers
    0     foo        1
    1     bar        2
    2    null        3
    

    完整的列表是:

    na_值:标量、str、类列表或dict,默认为none

    要识别为na/nan的其他字符串。如果dict通过,那么 每列NA值。默认情况下,将解释以下值 如NaN:,N/A,N/A N/A,NA,-1.IND,-1.QNaN,-NaN, -南,1.ind,1.qnan,不适用,不适用,无效,南,不适用,南, “空”。

        3
  •  5
  •   cs95 abhishek58g    7 年前

    我们可以动态排除 'NULL' 'null' 从默认集合 _NA_VALUES :

    In [4]: na_vals = pd.io.common._NA_VALUES.difference({'NULL','null'})
    
    In [5]: na_vals
    Out[5]:
    {'',
     '#N/A',
     '#N/A N/A',
     '#NA',
     '-1.#IND',
     '-1.#QNAN',
     '-NaN',
     '-nan',
     '1.#IND',
     '1.#QNAN',
     'N/A',
     'NA',
     'NaN',
     'n/a',
     'nan'}
    

    把它用在 read_csv() :

    df = pd.read_csv(io.StringIO(data), na_values=na_vals)
    
        4
  •  2
  •   Acccumulation    7 年前

    其他答案更适合在csv中阅读,而不需要将“null”解释为 Nan ,但如果您有要“修复”的数据帧,则此代码将执行以下操作: df=df.fillna('null')