我下面有一个数据框,其中包含用户购买的产品。
数据集:
user age maritalstatus product
A Young married 111
B young married 222
C young Single 111
D old single 222
E old married 111
F teen married 222
G teen married 555
H adult single 444
I adult single 333
字典:
{A:[111,222], B:[111,222], C:[111], D:[222], G:[222,555], X:[222,444] }
预期输出:
{A:[222], B:[111], C:[], D:[], G:[222], X:[222,444] }
字典应该查看数据框并删除用户已经购买的产品。
最佳答案
您可以使用字典理解:
{k:[e for e in v if e not in df.loc[df.user.eq(k), 'product'].tolist()] for k,v in d.items()}
Out[292]: {'A': [222], 'B': [111], 'C': [], 'D': [], 'G': [222], 'X': [222, 444]}
为了更容易理解而稍微详细一点的解决方案:
首先构建用户产品字典:
user_prod = df.groupby('user')['product'].apply(list).to_dict()
{'A': [111],
'B': [222],
'C': [111],
'D': [222],
'E': [111],
'F': [222],
'G': [555],
'H': [444],
'I': [333]}
然后,使用字典理解来删除 user_prod 字典中的元素。
{k:[e for e in v if e not in user_prod.get(k,[])] for k,v in d.items()}
Out[319]: {'A': [222], 'B': [111], 'C': [], 'D': [], 'G': [222], 'X': [222, 444]}
使用 user_prod.get 是必要的,因为用户可能不存在,而 .get 将通过返回空列表来避免异常。
关于python - 使用数据帧减去字典中列表的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49130520/