首页 > 解决方案 > 从基于另一个列表的列表列中删除列表值

问题描述

假设我有一个 DataFrame,其中一列是一列列表。我将如何删除那些列表中的所有元素,这些元素也在另一个指定列表中找到?原始列应保持完整,同时将新列添加到 DataFrame 中,并从每个行值中删除指定的列表元素。

df = pd.DataFrame({ 'Values': [['a', 'b', 'c'], ['a', 'b', 'c', 'd'], ['a', 'b'], ['c']]})

removal_list = ['a', 'b']

生成

Index   Values
0       ['a', 'b', 'c']
1       ['a', 'b', 'c', 'd']
2       ['a', 'b']
3       ['c']

期望的输出是......

Index   Values               Cleaned_Values
0       ['a', 'b', 'c']      ['c']
1       ['a', 'b', 'c', 'd'] ['c', 'd']
2       ['a', 'b']           []
3       ['c']                ['c']

标签: pythonpandas

解决方案


理解

df.assign(Cleaned_Values=[[x for x in y if x not in removal_list] for y in df.Values])

         Values Cleaned_Values
0     [a, b, c]            [c]
1  [a, b, c, d]         [c, d]
2        [a, b]             []
3           [c]            [c]

set

df.assign(Cleaned_Values=df.Values.map(set).sub({*removal_list}).map(list))

         Values Cleaned_Values
0     [a, b, c]            [c]
1  [a, b, c, d]         [c, d]
2        [a, b]             []
3           [c]            [c]

同样的事情,但有点快,因为我们一起处理所有的转换。

df.assign(Cleaned_Values=df.Values.map(lambda x: [*{*x} - {*removal_list}]))

推荐阅读