【问题标题】:Compare cell values csv file python比较单元格值csv文件python
【发布时间】:2017-04-06 08:42:29
【问题描述】:

我在 CSV 文件中有以下数据集

[1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 1, 1, 2]

现在我想通过比较它们来计算每个值并将其存储在一个数组中,但我不想要频率。所以我的输出应该是这样的:

[3, 4, 3, 2, 1]

我的代码如下:

import csv

with open("c:/Users/Niels/Desktop/test.csv", 'rb') as f:
    reader = csv.reader(f, delimiter=';')
    data = []

    for column in reader:
        data.append(column[0])

    results = data
    results = [int(i) for i in results]
    print results

    dataFiltered = []
    for i in results:
        if i == (i+1):
            counter = counter + 1
            dataFiltered.append(counter)
            counter = 0
    print dataFiltered

我的想法是通过比较单元格的值。我知道结果的 for 循环中有问题,但我不知道我的错误在哪里。我的想法是通过比较单元格值。也许

【问题讨论】:

  • if i == (i+1): 这不可能发生!是否要检查前一个元素是否与下一个元素相同?
  • 你为什么要results = data; results = [int(i) for i in results]?为什么不直接results = [int(i) for i in data]

标签: python csv


【解决方案1】:

我不会详细介绍你的循环的细节,这是非常错误的,if i==(i+1): 只是不能是 True 对于初学者。

接下来,您最好使用itertools.groupby 并对组的长度求和:

import itertools

results = [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 1, 1, 2]

freq = [len(list(v)) for _,v in itertools.groupby(results)]

print(freq)

len(list(v)) 使用list 强制对分组项进行迭代,以便我们可以计算长度(也许sum(1 for x in v) 会更高效/更合适,我没有对这两种方法进行测试)

我明白了:

[3, 4, 3, 2, 1]

另外:读取 csv 文件的第一列并将结果转换为整数可以简单地通过以下方式实现:

results = [int(row[0]) for row in reader]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多