在没有重复值的pandas系列上使用set会返回一个较小的对象

时间:2017-11-20 15:01:04

标签: python pandas set

我有一个具有唯一值的pandas系列,但在某种程度上使用set(或pd.unique()就此而言)会返回一个较小的对象。

In [255]: titles.shape
Out[255]: (77767,)

In [256]: len(set(titles))
Out[256]: 77750

In [257]: titles.nunique()
Out[257]: 77750

在进一步研究的同时,我发现set看到重复的内容彼此有一些相似之处,但它们并不是真正的重复。

In [254]: titles[titles.duplicated()]
Out[254]: 
927892                            Sham (film)
945686                     Shalom in the Home
947578                            Sham (play)
4380452                Blind Spot (1958 film)
4390747                Blind Spot (1932 film)
4403857                     Blind Rage (film)
4406443                  Blind Witness (film)
4421728                          Blind Terror
4424566                Blind Spot (1947 film)
4435819                           Blind Wives
4441354                           Blind Youth
4452296                Blind Side (1993 film)
4629350                  Ports of Call (film)
5562561                 Great Day (1945 film)
5586514              Great Day in the Morning
5634649    Great Continental Railway Journeys
5640835           Great Day (unfinished film)
Name: Title, dtype: object

究竟是什么触发了这个奇怪的问题?具有相同第一个单词的标题条目被set视为重复。更奇怪的是,我使用维基百科数据集来提取这些电影标题,因此必须有更多条目具有相同的第一个单词。但在这里我们只看到了这17个头衔。

In [265]: title_list = list(titles)

In [266]: len(title_list)
Out[266]: 77767

In [267]: title_list = [i.split()[0] for i in title_list]

In [268]: len(set(title_list))
Out[268]: 17696

有什么想法吗?

EDIT2: 删除了数据的链接,因为问题已成功回答。

1 个答案:

答案 0 :(得分:2)

让我们举一个简单的例子:

check = pd.Series([1,2,2,3,4,2])
check[check.duplicated()]
#2 2
#5 2
dtype: int64

因此,这显示没有第一个实例的重复。

正确的方法是:

check[check.isin(check[check.duplicated()])]
#1 2
#2 2
#5 2