一个python文件如何使用CSV?

2024-05-07 13:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在弄清楚如何将一个大数据集排序为更有用的数据时遇到了问题。在

CSV格式的原始文件如下所示-数据表示x、y、z位置,最后是能量。x,y,z坐标的分布方式有很多种,这是下面的一个小片段-基本上是对一个体积的能量搜索。在

-2.800000,-1.000000,5.470000,-0.26488315
-3.000000,1.000000,4.070000,-0.81185718
-2.800000,-1.000000,3.270000,1.29303723
-2.800000,-0.400000,4.870000,-0.51165026

不幸的是,很难在必要的四个维度上绘制,所以我需要修改这些数据。我想用这样一种方式,把体积变成一个在最低能量z轴上的曲面。对于较小的数据集,这很简单,在excel中按X、Y、energy进行排序,然后删除最低值以上的所有能量。对于小数据集来说,这很容易,但很快就成了问题。在

我尝试过各种方法来实现这一点,比如分割csv和使用sort命令,但是我运气不太好。如有任何关于如何处理这一问题的建议,我们将不胜感激。在


Tags: 文件csv数据方法排序格式方式绘制
3条回答

将数据读入带有csv.reader的元组列表后,按(x, y)值对数据进行排序。为了清楚起见,请使用named tuples来标识字段。在

然后使用itertools.groupby对相关的(x, y)数据点进行聚类。对于每一组,使用min来隔离能量最低的那一组:

>>> import csv, collections, itertools

>>> raw_data = '''\
-2.800000,-1.000000,5.470000,-0.26488315
-3.000000,1.000000,4.070000,-0.81185718
-2.800000,-1.000000,3.270000,1.29303723
-2.800000,-0.400000,4.870000,-0.51165026
'''.splitlines()

>>> Sample = collections.namedtuple('Sample', ['x', 'y', 'z', 'energy'])
>>> data = [Sample(*row) for row in csv.reader(raw_data)]
>>> data.sort(key=lambda s: (s.x, s.y))
>>> for xy, group in itertools.groupby(data, key=lambda s: (s.x, s.y)):
        print min(group, key=lambda s: s.energy)


Sample(x='-2.800000', y='-0.400000', z='4.870000', energy='-0.51165026')
Sample(x='-2.800000', y='-1.000000', z='5.470000', energy='-0.26488315')
Sample(x='-3.000000', y='1.000000', z='4.070000', energy='-0.81185718')

我想numpy的lexsort可以满足你的分类需求。在

总的来说,我认为你的步骤是:

  1. 把csv读入numpy数组有没有试过python的csv package或numpy的^{} function

  2. 使用lexsort进行排序

  3. 删去不必要的行

编辑:参见this related SO question。在

这是您在评论Raymond的答案时所要求的,它只返回每个x, y对的最低z行:

from operator import itemgetter
from itertools import groupby
from csv import reader


def min_z(iterable):
    # the data converted from strings to numbers
    floats = [[float(n) for n in row] for row in iterable]
    # the data sorted by x, y, z
    floats.sort(key=lambda (x, y, z, e): (x, y, z))
    # group the data by x, y
    grouped_floats = groupby(floats, key=itemgetter(slice(0, 2)))
    # return the first item from each group
    # because the data is sorted
    # the first item is the smallest z for the x, y group
    return [next(rowgroup) for xy, rowgroup in grouped_floats]


data = """-2.800000,-1.000000,5.470000,-0.26488315
-3.000000,1.000000,4.070000,-0.81185718
-2.800000,-1.000000,3.270000,1.29303723
-2.800000,-0.400000,4.870000,-0.51165026""".splitlines()


print min_z(reader(data))

印刷品:

^{pr2}$

相关问题 更多 >