【问题标题】:Data Cleanup: Eliminating values contained in csv file from result数据清理:从结果中消除 csv 文件中包含的值
【发布时间】:2019-11-25 14:26:51
【问题描述】:

我希望我的最终数据不包含我想要清理的初始测试数据的元素。在代码中复制和粘贴数据的过程非常繁琐,并且随着添加的条件越来越多变得复杂。

原始值

(1, 2, 3), (1, 2, 4),  (1, 2, 5), (1, 3, 4), (1, 3, 5)
(1, 4, 5), (2, 3, 4),  (2, 3, 5), (2, 4, 5), (3, 4, 5)

我想要一个排除 Test.csv

中包含的组合的组合
(1,2,3),   (2,3,4),     (3,4,5),

预期值

(1, 2, 4),
(1, 2, 5),
(1, 3, 4),
(1, 3, 5),
(1, 4, 5),
(2, 3, 5),
(2, 4, 5)

代码尝试 1

a = [1,2,3,4,5]

import csv

with open('Test.csv', newline='') as myFile:  
    reader = csv.reader(myFile)
    list_a = list(reader)

combo_a = [(p,q,r) for p in a for q in a for r in a
                 if q > p and r > q and r > p
                 and (p,q,r) not in list_a]

print (combo_a)

代码尝试 2

 a = [1,2,3,4,5]

import csv

with open('Test.csv', newline='') as myFile:  
    reader = csv.reader(myFile)
    list_a = list(map(tuple, reader))

combo_a = [(p,q,r) for p in a for q in a for r in a
                 if q > p and r > q and r > p
                 and (p,q,r) not in list_a]

print (combo_a)

两个代码都输出不正确的结果

(1, 2, 3),
(1, 2, 4),
(1, 2, 5),
(1, 3, 4),
(1, 3, 5),
(1, 4, 5),
(2, 3, 4),
(2, 3, 5),
(2, 4, 5),
(3, 4, 5),

【问题讨论】:

  • 您是否尝试将列表理解展开到常规的for循环中?可能更容易看到问题。
  • 你看过list_alist(map(tuple, reader)) 之后是什么吗?我不完全确定它是否为您提供了您正在寻找的东西
  • 这是 list_a [('1', '2', '3'), ('2', '3', '4'), ('3', '4 ', '5')]

标签: python python-3.x csv data-cleaning


【解决方案1】:

带有file.csv的内容:

(1,2,3),   (2,3,4),     (3,4,5),

并使用csvast.literal_eval

a = [1,2,3,4,5]

import csv
from ast import literal_eval
from itertools import combinations

excluded = set()
with open('file.csv', newline='') as myFile:
    reader = csv.reader(myFile, delimiter=' ')
    for row in reader:
        l = list(map(literal_eval, [val for val in row if val]))
        excluded.update(tuple(i[0]) for i in l)

print(',\n'.join(map(str, sorted(set(combinations(a, 3)) - excluded))))

打印:

(1, 2, 4),
(1, 2, 5),
(1, 3, 4),
(1, 3, 5),
(1, 4, 5),
(2, 3, 5),
(2, 4, 5)

【讨论】:

    【解决方案2】:

    看起来您的 list_a 是一个字符串元组,而不是整数。所以如果你的

    list_a = [('1', '2', '3'), ('2', '3', '4'), ('3', '4', '5')]
    

    然后使用

    将其转换为整数
    list_a = [tuple(map(int, i)) for i in list_a]
    

    一旦它是整数元组列表的形式,那么您就可以继续您的combo_a 操作。

    【讨论】:

    • 列表一般在下面的列中。转换成整数有什么帮助?请详细说明。 (1,2,3), (2,3,4), (3,4,5),
    • 您的列表似乎是字符串元组,而不是整数,您使用(p,q,r) not in list_a 进行比较,其中p,q,r 是整数,而list_a 是字符串。所以 (1,2,3) 不会在 [('1','2','3')] 中。因此,一种解决方案是在进行比较之前将其转换为整数元组列表。
    【解决方案3】:

    所以您正在尝试过滤特定值?

    我要做的是保留一个包含您不想要的值的列表。之后只需检查您要过滤的元组是否在列表中。

    因此,将 test.csv 中的所有值加载到您的列表中。

    dont_want = [some set of tuples you dont want]
    
    
    combo_a = [(p,q,r) for p in a for q in a for r in a
                     if (p,q,r) not in dont_want]
    
    

    如果我误解了你的问题,请原谅我,但我想我知道你在问什么。

    【讨论】:

    • 是的,我是。我已经做到了,它会抛出不正确的结果。代码有问题吗?
    【解决方案4】:

    部分问题是您实际上并没有处理int,而是处理字符串列表,因为元组与条目本身是用逗号分隔的:

    from io import StringIO
    import csv
    
    c = """(1,2,3),   (2,3,4),     (3,4,5),"""
    
    fh = StringIO(c, newline='')
    
    reader = csv.reader(fh)
    next(reader)
    
    # ['(1', '2', '3)', '   (2', '3', '4)', '     (3', '4', '5)', '']
    

    这不是一个元组列表,所以要把它变成一个:

    import ast
    from io import StringIO # this simulates your file handle
    
    fh = StringIO(c, newline='')
    
    # it's only one line, so call next(fh)
    lst = ast.literal_eval(f"[{next(fh)}]")
    
    # [(1, 2, 3), (2, 3, 4), (3, 4, 5)]
    

    ast 会将它们处理成它们的原生数据结构。翻译成你的代码:

    import ast
    
    with open('Test.csv', newline='') as fh:
        list_a = ast.literal_eval(f"[{next(fh)}]")
    

    现在list_a 是一个整数元组列表。然后你可以排除列表中的那些:

    from itertools import combinations
    
    checked = set()
    
    for c in combinations(list(range(1,6)), 3):
        a = tuple(sorted(c))
        if a not in list_a and a not in checked:
            print(a)
            checked.add(a)
    
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2014-07-25
      • 1970-01-01
      • 2019-09-03
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多