在pandas中从一个序列创建一个集合

69
我有一个从 Kaggle 的 San Francisco Salaries 中提取的数据框,链接在这里 https://www.kaggle.com/kaggle/sf-salaries ,我想创建一个列值的集合,例如 'Status'。
这是我尝试过的代码,但它带来的是所有记录的列表,而不是集合(sf 是我给数据框命名的方式)。
a=set(sf['Status'])
print a
根据这个网页,这应该可行。如何在Python中用列表项构建集合?

你为什么说 a 是一个列表? - tacaswell
也许我使用了不正确的术语,我的意思是它会给我该列中的所有值,而不关心它是否是纯NaN。 - Julio Arriaga
2个回答

112

如果您只需要获取唯一值的列表,可以直接使用unique方法。 如果你想要Python的set,则可以使用set(some_series)

In [1]: s = pd.Series([1, 2, 3, 1, 1, 4])

In [2]: s.unique()
Out[2]: array([1, 2, 3, 4])

In [3]: set(s)
Out[3]: {1, 2, 3, 4}

不过,如果您有DataFrame,则可以从中选择系列(some_data_frame['<col_name>'])。


41

使用带有重复项的大型 seriesset(some_series) 的执行时间会随着 series 大小呈指数级增长。

更好的做法是使用 set(some_series.unique())

一个简单的示例显示了16倍的执行时间。enter image description here

2
有人能解释一下为什么在不使用unique的情况下,执行时间会呈指数级增长吗? - justinpc
4
如果你的序列已经是独一无二的,使用.unique()仍然能提升速度吗?答案是是的,即使序列本身已经没有重复项,.unique()仍然可以提高速度。原因是.unique()方法会使用算法来检查每个元素是否已经存在于结果集中,这个算法比简单地将序列转换为一个集合并创建一个新的集合要快得多。另外,.unique()方法返回一个数组,而不是一个集合对象,因此可以更灵活地处理结果。 - Vega
也不要认为它会呈指数级增长,这是为什么呢? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接