我有记录,其中字段(称为INDATUMA
和UTDATUMA
)应该包含20010101和20141231之间的数字(出于明显的原因)。为了允许丢失值但保持精度到最近的日期,我会将它们存储为浮点数(np.float64)。我希望这会强制偶尔将格式错误的字段(例如2oo41oo9)设置为NA
s,但是会破坏熊猫0.18.0或IOPro 1.7.2的导入。
有没有记载的选项可以使用?要不然?
尝试熊猫的关键是
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
最佳答案
您可以在converters
中使用参数read_table
:
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
或使用
errors='coerce'
的参数to_numeric
后处理:df['INDATUMA'] = pd.to_numeric(df['INDATUMA'], errors='coerce')
0 20030707
1 NaN
Name: INDATUMA, dtype: float64