【问题标题】:How to create a list in Python with the unique values of a CSV file?如何在 Python 中使用 CSV 文件的唯一值创建列表?
【发布时间】:2023-03-16 21:16:01
【问题描述】:

我的 CSV 文件如下所示,

1994, Category1, Something Happened 1
1994, Category2, Something Happened 2
1995, Category1, Something Happened 3
1996, Category3, Something Happened 4
1998, Category2, Something Happened 5

我想创建两个列表,

Category = [Category1, Category2, Category3]

Year = [1994, 1995, 1996, 1998]

我想省略列中的重复项。我正在阅读以下文件,

DataCaptured = csv.reader(DataFile, delimiter=',')  
DataCaptured.next()

和循环,

   for Column in DataCaptured:

【问题讨论】:

  • CategoryYear之间有关系吗?
  • @dawg 不。它们不相关。他们只是在那一年发生的随机事件。

标签: python list csv unique


【解决方案1】:

你可以这样做:

DataCaptured = csv.reader(DataFile, delimiter=',', skipinitialspace=True) 

Category, Year = [], []
for row in DataCaptured:
    if row[0] not in Year:
        Year.append(row[0])
    if row[1] not in Category:
        Category.append(row[1])    

print Category, Year        
# ['Category1', 'Category2', 'Category3'] ['1994', '1995', '1996', '1998']

如 cmets 中所述,如果顺序无关紧要,使用 set 会更容易、更快捷:

Category, Year = set(), set()
for row in DataCaptured:
    Year.add(row[0])
    Category.add(row[1])

【讨论】:

    【解决方案2】:

    一个非常简洁的方法是使用pandas,好处是:它有一个更快的CSV pharser;它在列中工作(因此只需要一个df.apply(set) 就可以到达那里):

    In [244]:
    #Suppose the CSV is named temp.csv
    df=pd.read_csv('temp.csv',header=None)
    df.apply(set)
    Out[244]:
    0                        set([1994, 1995, 1996, 1998])
    1            set([ Category2,  Category3,  Category1])
    2    set([ Something Happened 4,  Something Happene...
    dtype: object
    

    缺点是它返回一个pandas.Series,并且要访问每个列表,您需要执行list(df.apply(set)[0]) 之类的操作。

    编辑

    如果必须保留订单,也可以很容易做到,例如:

    for i, item in df.iteritems():
        print item.unique()
    

    item.unique() 将返回 numpy.arrays,而不是 lists。

    【讨论】:

      【解决方案3】:

      dawg 指出了 Python 中最大的技巧之一:使用 set() 从列表中删除重复项。 dawg 展示了如何通过将每个项目添加到 set 来从头开始构建唯一列表,这是完美的。但这是另一种等效的方法,使用list(set()) 方法生成包含重复项的列表和不包含重复项的列表:

      import csv
      
      in_str = [
          'year, category, event',
          '1994, Category1, Something Happened 1',
          '1994, Category2, Something Happened 2',
          '1995, Category1, Something Happened 3',
          '1996, Category3, Something Happened 4',
          '1998, Category2, Something Happened 5'
          ]
      
      cdr = csv.DictReader(in_str, skipinitialspace=True)
      
      col = []
      for i in cdr:
          col.append(i['category'])
      
      # all items in the column...
      print(col)
      # only unique items in the column...
      print(list(set(col)))
      

      【讨论】:

        猜你喜欢
        • 2011-01-06
        • 2015-05-02
        • 1970-01-01
        • 2023-04-03
        • 2011-05-06
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多