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

时间:2013-12-02 19:24:38

标签: 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

# 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'列是重复的。我不关心userID。

期望的输出:

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

1 个答案:

答案 0 :(得分:2)

尝试使用元组而不是列表。你需要传递一些可用于drop_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