执行转换器函数后,是否会转换read_fwf()/ read_csv()/ read_table()中的na_values?

时间:2012-08-27 18:22:33

标签: python pandas

我需要从固定宽度的平面文件中读入数据帧。这是一种对性能敏感的操作。

我希望从列值中删除所有空白空格。在删除空白之后,我希望将空字符串转换为NaN或None值。以下是我的两个想法:

pd.read_fwf(path, colspecs=markers, names=columns,
            converters=create_convert_dict(columns))

def create_convert_dict(columns):
    convert_dict = {}
    for col in columns:
        convert_dict[col] = null_convert
        return convert_dict

def null_convert(value):
    value = value.strip()
    if value == "":
        return None
    else:
        return value

或:

pd.read_fwf(path, colspecs=markers, names=columns, na_values='',
            converters=create_convert_dict(columns))

def create_convert_dict(columns):
    convert_dict = {}
    for col in columns:
        convert_dict[col] = col_strip
    return convert_dict

def col_strip(value):
    return value.strip()

显然第二个选项取决于在na_values之前评估转换器(剥离空白)。

我想知道第二个是否可行。我很好奇的原因是因为保留NaN似乎更好,Null值与None相反。

我也对如何执行此操作的任何其他建议持开放态度(剥离空格然后将空字符串转换为NaN)。

我目前无法访问安装了pandas的计算机,这就是我自己无法测试的原因。

由于

1 个答案:

答案 0 :(得分:1)

对于固定宽度文件,无需执行任何特殊操作来剥离空白区域或处理缺少的字段。下面是固定宽度文件的一个小例子,每列宽度为5列。有尾随和前导空格+缺少数据。

In [57]: data = """\
A    B     C     
 0    foo       
3    bar     2.0
  1        3.0
"""

In [58]: df = pandas.read_fwf(StringIO(data), widths=[5, 5, 5])

In [59]: df
Out[59]: 
   A    B   C
0  0  foo NaN
1  3  bar   2
2  1  NaN   3

In [60]: df.dtypes
Out[60]: 
A      int64
B     object
C    float64