【问题标题】:forcing non-numeric characters to NAs in numpy (when reading a csv to a pandas dataframe)在 numpy 中将非数字字符强制为 NAs(将 csv 读取到 pandas 数据帧时)
【发布时间】:2016-03-15 08:41:50
【问题描述】:

我有记录,其中字段(称为 INDATUMAUTDATUMA)应该包含 20010101 和 20141231 范围内的数字(原因很明显)。为了允许缺失值但保持精确到最近的日期,我会将它们存储为浮点数(np.float64)。我希望这会迫使偶尔格式错误的字段(想想 2oo41oo9)到NAs,而是在 pandas 0.18.0 或 IOPro 1.7.2 中破坏导入。

是否有未记录的选项可以使用?不然呢?

pandas 尝试的关键是

import numpy as np
import pandas as pd
treatments = pd.read_table(filename,usecols=[0,3,4,6], engine='c', dtype={'LopNr':np.uint32,'INDATUMA':np.float64,'UTDATUMA':np.float64,'DIAGNOS':object})

带有错误ValueError: invalid literal for float(): 2003o730

我在 IOPro 中尝试了以下操作,以防万一:

import iopro
adapter = iopro.text_adapter(filename, parser='csv',delimiter='\t',output='dataframe',infer_types=False)
adapter.set_field_types({0: 'u4',3:'f8', 4:'f8',6:'object'})
all_treatments.append(adapter[[0,3,4,6]][:])

但这也与iopro.lib.errors.DataTypeError: Could not convert token "2003o730" at record 1 field 3 to float64.Reason: unknown 中断了

数据文件开头为

LopNr   SJUKHUS MVO INDATUMA    UTDATUMA    HDIA    DIAGNOS OP  PVARD   EKOD1   EKOD2   EKOD3   EKOD4   EKOD5   ICD
1562    21001   046 20030707    20030711    I489A   I489A I509      2                       10
1562    21001   046 2003o730    20030801    I501    I501 I489A  DG001   2                       10

【问题讨论】:

    标签: python numpy pandas casting iopro


    【解决方案1】:

    您可以在read_table中使用参数converters

    def converter(num):
        try:
            return np.float(num)
        except:
            return np.nan
    
    #define each column
    converters={'INDATUMA': converter, 'UTDATUMA': converter}
    
    df = pd.read_table(filename, converters=converters)
    print df
       LopNr  SJUKHUS  MVO  INDATUMA  UTDATUMA   HDIA DIAGNOS     OP  PVARD  \
    0   1562    21001   46  20030707  20030711  I489A   I489A   I509      2   
    1   1562    21001   46       NaN  20030801   I501    I501  I489A  DG001   
    
       EKOD1  EKOD2  EKOD3  EKOD4  EKOD5  ICD  
    0     10    NaN    NaN    NaN    NaN  NaN  
    1      2     10    NaN    NaN    NaN  NaN  
    

    或者用to_numeric的参数errors='coerce'进行后处理:

    df['INDATUMA'] = pd.to_numeric(df['INDATUMA'], errors='coerce')
    0    20030707
    1         NaN
    Name: INDATUMA, dtype: float64
    

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 2014-06-07
      • 2020-06-10
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多