如何在Python中创建包含CSV文件唯一值的列表?
我有一个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:
3 个回答
2
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)))
7
一种非常简洁的方法是使用 pandas
,它的好处是:它的CSV解析速度更快;而且它是按列处理的(所以只需要用一次 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.array
,而不是 list
。
13
你可以这样做:
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])