2012-08-27 27 views
0

我需要從固定寬度的平面文件讀入數據幀。這是一個對性能敏感的操作。轉換器函數執行後,read_fwf()/ read_csv()/ read_table()中的na_values是否會被轉換?

我想要從列值中刪除所有空白空白。在刪除空白符之後,我想將空白字符串轉換爲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)。

我目前無法訪問安裝有熊貓的計算機,這就是爲什麼我無法自己測試此功能的原因。

感謝

回答

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