python - 使用数据帧减去字典中列表的值

标签 python list pandas dictionary

我下面有一个数据框,其中包含用户购买的产品。

数据集:

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/

相关文章:

python - 如何从 Dask DataFrame 中提取前五个值而不计算整个 DataFrame?

python - 运行时 Tkinter 窗口为空白

javascript - 在有序/无序列表上按回车键在每个 <li> 元素后添加 <br>

java - 如何将 2D arraylist 传递给接受 2D List 的函数

python - 循环依赖导致 ImportError : cannot import name

Python 等同于 Java 的 JNLP Web Start?

list - Scala 反转 zip

python-3.x - 如何在两列中加载信息?

调用 `.info()` 时,带有列表元素的 Python Pandas Dataframe 报告错误类型?

python - 检查 header 是否存在于 Python pandas