Python 将用户/项目交互转换为稀疏列表删除重复项

Python 将用户/项目交互转换为稀疏列表删除重复项,python,pandas,Python,Pandas,我想使用事务数据构建一个稀疏列表,其中每一新行都由用户的条目ID的空格分隔列表组成,然后将结果写入一个文件。 我一直在寻找一种生成唯一行的有效方法。以下是一些示例输入: # Make input d = pd.DataFrame([1,1,2,2,3,4,4], columns=['userID']) d['itemID'] = [2,3,2,4,1,2,4] d['code'] = ['AA', 'AA', 'AB', 'AA', 'AB', 'AB', 'AC'] print d # Gr

我想使用事务数据构建一个稀疏列表,其中每一新行都由用户的条目ID的空格分隔列表组成,然后将结果写入一个文件。 我一直在寻找一种生成唯一行的有效方法。以下是一些示例输入:

# Make input
d = pd.DataFrame([1,1,2,2,3,4,4], columns=['userID'])
d['itemID'] = [2,3,2,4,1,2,4]
d['code'] = ['AA', 'AA', 'AB', 'AA', 'AB', 'AB', 'AC']
print d

# Group by userID
print d.groupby(by='userID').head()

# Return the country codes
codes = list(d.groupby("userID")["code"].first())

# Grab the list of itemID's for each userID
b = d.groupby("userID")["itemID"].unique()
dd = pd.DataFrame(b, columns=['itemID']).reset_index()
dd['code'] = codes # Set the code column
print dd

#print dd.drop_duplicates(cols=["code", "itemID"])
最后一行(如果未注释)给出了错误:

ValueError:包含多个元素的数组的真值为 不明确。请使用a.any()或a.all()

因为itemID列包含多个列

有更好的方法吗

以下是上述代码的输出:

   userID  itemID code
0       1       2   AA
1       1       3   AA
2       2       2   AB
3       2       4   AA
4       3       1   AB
5       4       2   AB
6       4       4   AC
          userID  itemID code
userID                       
1      0       1       2   AA
       1       1       3   AA
2      2       2       2   AB
       3       2       4   AA
3      4       3       1   AB
4      5       4       2   AB
       6       4       4   AC
   userID  itemID code
0       1  [2, 3]   AA
1       2  [2, 4]   AB
2       3     [1]   AB
3       4  [2, 4]   AB
在最后的输出中,我想删除索引3,因为它是索引1的副本,因为'itemID'和'code'列是重复的。我不关心用户ID

期望输出:

   userID  itemID code
0       1  [2, 3]   AA
1       2  [2, 4]   AB
2       3     [1]   AB

尝试使用元组而不是列表。您需要在
drop\u duplicates
中传递一些可用于比较的哈希值才能工作:

>>> dd = pd.DataFrame(b.map(lambda x: tuple(x)), columns=['itemID']).reset_index()
>>> dd['code'] = codes
>>> dd.drop_duplicates(cols=["code", "itemID"])
   userID  itemID code
0       1  (2, 3)   AA
1       2  (2, 4)   AB
2       3    (1,)   AB