【问题标题】:How to handle missing data in a csv file without using numpy/pandas?如何在不使用 numpy/pandas 的情况下处理 csv 文件中的缺失数据?
【发布时间】:2014-10-19 08:00:26
【问题描述】:

我正在尝试从包含一些缺失数据的 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 有一个很好的答案,并且有一个令人信服的理由说明为什么使用额外的库也不错,我也会接受。

我不想使用第三方库的原因是,包括我自己在内的几个人将致力于此,然后会有相当多的人使用它。我宁愿不让他们都安装另一个库来完成这项工作。

【问题讨论】:

    标签: python parsing csv numpy pandas


    【解决方案1】:

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

    • 为每列指定类型
    • 编写一个快速转换函数来尝试每个转换
    • 使用列表组合/生成器表达式在每个单元格上调用转换函数

    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

    【讨论】:

    • 抱歉,刚刚注意到在最后一列中,您必须将 list 替换为自定义函数,该函数将列表的字符串表示形式转换为实际的 Python 列表,即 list() 调用不会这样做,所以你只会得到所有行的“No_Data”。
    • 这不会也传入Sym 值吗?我打算排除它,因为我将它用作 dict 键
    • 是的,抱歉,它会传入Sym/tl[1] 值。您可以在将 new_row 放入表中之前对其进行切片,或者在列位置和转换函数(如 dict)之间找到其他映射方式,我试图理解的主要思想是有某种映射来识别每一列。
    【解决方案2】:

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

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

    【讨论】:

    • 就像我说的,我尽量避免使用 numpy
    • 对不起,我正在阅读有关 python 中缺失值的多个问题。我没有仔细阅读你的问题。
    猜你喜欢
    • 2015-12-10
    • 2020-10-12
    • 1970-01-01
    • 2019-08-19
    • 2021-02-15
    • 2012-04-30
    • 2020-02-21
    • 2017-02-10
    • 2013-12-15
    相关资源
    最近更新 更多