如何在Python中使用CSV文件的唯一值创建列表?

2024-05-16 03:03:00 发布

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

我有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:

Tags: 文件csv列表yearsomethingreader省略category
3条回答

一个非常简洁的方法是使用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

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)))

你可以:

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']

如评论中所述,如果顺序无关紧要,则使用集合将更容易和更快:

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

相关问题 更多 >