如何在 Python 中使用 CSV 文件的唯一值创建列表?
Posted
技术标签:
【中文标题】如何在 Python 中使用 CSV 文件的唯一值创建列表?【英文标题】:How to create a list in Python with the unique values of a CSV file? 【发布时间】:2014-08-17 23:03:18 【问题描述】:我的 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:
【问题讨论】:
Category
和Year
之间有关系吗?
@dawg 不。它们不相关。他们只是在那一年发生的随机事件。
【参考方案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.array
s,而不是 list
s。
【讨论】:
【参考方案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)))
【讨论】:
以上是关于如何在 Python 中使用 CSV 文件的唯一值创建列表?的主要内容,如果未能解决你的问题,请参考以下文章
使用 python,我如何从 csv 中获取唯一行,但获取合并了哪些行(或行中的值)的记录?