与系列,列表和独特元素混淆

时间:2017-05-26 07:46:38

标签: python list pandas typeerror series

我想问一些帮助,因为我无法理解python程序中的TypeError。 这段代码:

users2 = np.random.choice(users,5000).tolist()
print len(users2)
print users2[0:20]

for user in users2:
   tags.append(user_counters["tags"].loc[user])

print type(tags)
print set(tags)

标签的类型是列表。但是当我应用set()方法来获取“tags”列表的唯一元素时,会出现以下错误:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

好的,我明白这是什么意思但我无法理解什么是“系列”的类型。

另一方面,如果使用:

print tags.unique()

另一个错误出现了:

AttributeError: 'list' object has no attribute 'unique'

注意:users_counters类型为数据集用户类型为列表,其元素来自users_counters。< / p>

那么为什么会发生TypeError错误,因为 tag 是list 而set()是列表?

感谢adnvance

1 个答案:

答案 0 :(得分:2)

您的tagspandas.Series个对象的列表。当您从数据框中基于loc的选择构建列表时:

for user in users2:
   tags.append(user_counters["tags"].loc[user])

你会得到Series。然后你尝试从系列列表中创建一个集合,但是你不能因为系列不可用。

  

那么为什么TypeError会发生错误,因为tag是list而set()是   列表?

咦? set接受任何iterable,并且该iterable的元素用于构造结果set。您的iterable是list,元素是pandas.Series个对象。这就是问题所在。

我怀疑你的数据框由一系列代表用户的字符串索引......

>>> df = pd.DataFrame({'tag':[1,2,3, 4], 'c':[1.4,3.9, 2.8, 6.9]}, index=['ted','sara','anne', 'ted'])
>>> df
        c  tag
ted   1.4    1
sara  3.9    2
anne  2.8    3
ted   6.9    4
>>>

当您进行选择时,由于您的用户索引具有非唯一数据元素,因此当您执行以下选择时,您将获得Series

>>> df['tag'].loc['ted']
user
ted    1
ted    4
Name: a, dtype: int64
>>> type(df['a'].loc['ted'])
<class 'pandas.core.series.Series'>