我想使用事务数据来构建稀疏列表,其中每个新行由用户的空格分隔的项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
答案 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