python - 使用 scipy/numpy 在 Python 中解析字母数字 CSV 的 final方法

标签 python parsing csv numpy scipy

我一直在努力寻找一种在 Python 中解析 CSV 文件的良好且灵活的方法,但似乎没有一个标准选项符合要求。我很想自己写一个,但我认为 numpy/scipy 和 csv 模块中存在的一些组合可以满足我的需要,所以我不想重新发明轮子。

我想要能够指定分隔符的标准功能,指定是否有标题、要跳过的行数、注释分隔符、要忽略的列等。我缺少的核心功能是能够以优雅地处理字符串数据和数字数据的方式解析 CSV 文件。我的许多 CSV 文件都有包含字符串(长度不一定相同)和数字数据的列。我希望能够为这些数字数据提供 numpy 数组功能,但也能够访问字符串。例如,假设我的文件如下所示(假设列是用制表符分隔的):

# my file
name  favorite_integer  favorite_float1  favorite_float2  short_description
johnny  5  60.2  0.52  johnny likes fruitflies
bob 1  17.52  0.001  bob, bobby, robert

data = loadcsv('myfile.csv', delimiter='\t', parse_header=True, comment='#')

我希望能够通过两种方式访问​​数据:

  1. 作为值矩阵:获取 numpy.array 对我来说很重要,这样我就可以轻松转置和访问数字列。在这种情况下,我希望能够执行以下操作:

    floats_and_ints = data.matrix

    floats_and_ints[:, 0] # 访问整数

    floats_and_ints[:, 1:3] # 访问一些 float 转置(floats_and_ints)# 等。

  2. 作为一个类似字典的对象,我不必知道标题的顺序:我还想按标题顺序访问数据。例如,我想这样做:

    data['favorite_float1'] # 获取带有标题的列的所有值 “favorite_float1”

    data['name'] # 获取所有行的名称

我不想知道 favorite_float1 是表中的第二列,因为这可能会改变。

能够遍历行并按名称访问字段对我来说也很重要。例如:

for row in data:
  # print names and favorite integers of all 
  print "Name: ", row["name"], row["favorite_int"]

(1) 中的表示建议使用 numpy.array,但据我所知,这不能很好地处理字符串,需要我提前指定数据类型以及标题标签。

(2) 中的表示建议了一个字典列表,这就是我一直在使用的。但是,这对于具有两个字符串字段但其余列为数字的 csv 文件来说确实很糟糕。对于数值,您确实希望有时能够访问矩阵表示并将其作为 numpy.array 进行操作。

是否有 csv/numpy/scipy 功能的组合,允许两个世界的灵 active ?对此有任何建议,我们将不胜感激。

总结起来,主要的特点是:

  1. 指定分隔符、要跳过的行数、要忽略的列等的标准能力。
  2. 能够获取数据的 numpy.array/matrix 表示,以便可以操纵数值
  3. 能够按标题名称提取列和行(如上例所示)

最佳答案

看看pandas它建立在 numpy 之上。 这是一个小例子:

In [7]: df = pd.read_csv('data.csv', sep='\t', index_col='name')
In [8]: df
Out[8]: 
        favorite_integer  favorite_float1  favorite_float2        short_description
name                                                                               
johnny                 5            60.20            0.520  johnny likes fruitflies
bob                    1            17.52            0.001       bob, bobby, robert
In [9]: df.describe()
Out[9]: 
       favorite_integer  favorite_float1  favorite_float2
count          2.000000         2.000000         2.000000
mean           3.000000        38.860000         0.260500
std            2.828427        30.179317         0.366988
min            1.000000        17.520000         0.001000
25%            2.000000        28.190000         0.130750
50%            3.000000        38.860000         0.260500
75%            4.000000        49.530000         0.390250
max            5.000000        60.200000         0.520000
In [13]: df.ix['johnny', 'favorite_integer']
Out[13]: 5
In [15]: df['favorite_float1'] # or attribute: df.favorite_float1
Out[15]: 
name
johnny    60.20
bob       17.52
Name: favorite_float1
In [16]: df['mean_favorite'] = df.mean(axis=1)
In [17]: df.ix[:, 3:]
Out[17]: 
              short_description  mean_favorite
name                                          
johnny  johnny likes fruitflies      21.906667
bob          bob, bobby, robert       6.173667

关于python - 使用 scipy/numpy 在 Python 中解析字母数字 CSV 的 final方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2981383/

相关文章:

python - 如何使用 Tkinter 导入索引列为 "date"的 csv 文件

javascript - 在 vue/typescript 中解析 CSV 文件

python - 了解 Python 集合的行为

parsing - 递归下降解析: high precedence unary operators

python - 在 python 日志库中查找 "not enough arguments..."的简单方法

c# - 改进/修复 C 样式 block 注释的正则表达式

parsing - Monadic 解析函数珍珠 - 将多个解析器粘合在一起

python - 用python重采样和合并数据框

python - 轨道评论服务器问题

python - 调整 gridspec 中的填充/图形边距