如何在不使用numpy / pandas的情况下处理csv文件中的缺失数据?

时间:2014-08-26 04:51:56

标签: python parsing csv numpy pandas

我正在尝试从包含一些缺失数据的csv文件中提取数据

Num,Sym,Element,Group,Weight,Density,Melting,Boiling,Heat,Eneg,Radius,Oxidation
1,H,Hydrogen,1,1.008,0.00008988,14.01,20.28,14.304,2.2,53,"[1,-1]"
2,He,Helium,18,4.002602,0.0001785,0.956,4.22,5.193,No_Data,31,[0]
etc

在这种情况下,缺失值是惰性气体氦的电负性。我还想一次解析这些数据(即当我读入它时)并将其转换为适当的数据类型,以便我可以根据需要使用此函数执行计算

import csv

def read_periodic_table(): 
    per_table = {}
    with open("element_list.csv", "r") as f:
        my_reader = csv.reader(f)
        my_reader.next() # Just skipping the header
        try:
            while True:
                tl = my_reader.next()
                per_table[tl[1]] =(int(tl[0]), tl[2], int(tl[3]), float(tl[4]),
                                   float(tl[5]), float(tl[6]), float(tl[7]),
                                   float(tl[8]), float(tl[9]), float(tl[10]),
                                   list(tl[11]))

        except StopIteration:
            return

这种方法很好,除非有些地方没有数据(如上所述),我得到TypeError。我明白为什么会出现错误 - 你无法真正将"No_Data"转换为浮点数。

我已经阅读了这些问题

这可能会回答我的问题,除了我想避免为一个函数使用额外的库。

我能想到处理这个的唯一方法是一些try/except块...很多

像这样的东西

num = tl[0]
name = tl[2]
group = tl[3]
try:
    weight = float(tl[4])
except TypeError:
    weight = "No_Data"
finally:
    try:
        density = float(tl[5])
    except TypeError:
        density = "No_Data"
    finally:
        try:
            ...

对于我希望的显而易见的原因,我宁愿避免。有没有办法只使用标准库来实现这一目标?如果答案是 - “不,不是很容易/很好”那么那很好,我只会使用numpy / pandas。我想尽可能避免这种情况。或者,如果有一个很棒的答案与numpy / pandas和一个令人信服的理由为什么使用额外的库也不错,我也会采取这种方式。

我不想使用第三方图书馆的原因是包括我在内的几个人都会在这方面工作,之后会有很多人使用它。我宁愿不让他们全部安装另一个库来使这项工作。

2 个答案:

答案 0 :(得分:3)

如果我绝对决定不使用pandas,我会做这样的事情:

  • 指定每列的类型
  • 编写快速转换功能以尝试每次转化
  • 使用列表comp / generator表达式调用每个单元格的转换函数

def convert_type(cell, typ):
    try:
        return typ(cell)
    except TypeError:
        return "No_Data"

# These lines go below 'tl = my_reader.next()' in your code
col_types = [int, str, int, float, float, float, float, float, float, float, float, list]
new_row = tuple(convert_type(cell, typ) for cell, typ in zip(tl, col_types))
per_table[tl[1]] = new_row

那就是说,如果我自己这样做,我肯定会使用pandas。像Anaconda这样的发行版是一个很好的选择,可以快速设置Python,包含许多有用的库,例如pandas

答案 1 :(得分:-1)

我认为将缺少值的文本数据导入python的最佳方法是numpy的genfromtxt函数。这是非常容易使用。在我的情况下,缺失值由'?'表示,你应该使用空字符串''。

 train = np.genfromtxt(path + 'cleveland.data', float, delimiter=',',missing_values='?',filling_values=np.nan)