根据另一个列表从pandas dataframe列中的列表中删除值

时间:2019-09-06 10:43:34

标签: python pandas dataframe list-comprehension

我在包含列表的数据框中有一列。我希望能够根据另一个列表中的元素从这些列表中删除元素(如下所示)。

我尝试使用列表理解,但似乎没有结果。

import pandas as pd

sys_list = ['sys1', 'sys2', 'sys3']
df = pd.DataFrame({'A':[['sys1', 'sys2', 'user1'], 
                        ['user3', 'user6', 'user1'], 
                        ['sys1', 'sys2', 'sys3']]})

df['A'] = [item for item in df['A'] if item not in sys_list]

print(df)

                       A
0    [sys1, sys2, user1]
1  [user3, user6, user1]
2     [sys1, sys2, sys3]

我需要实现这一目标:

                       A
0                [user1]
1  [user3, user6, user1]
2                     []

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

apply

df.A.apply(lambda x: [i for i in x if i not in sys_list])

0                  [user1]
1    [user3, user6, user1]
2                       []
Name: A, dtype: object

答案 1 :(得分:1)

使用Series.apply

df['B'] = df['A'].apply(lambda x: [item for item in x if item not in set(sys_list)])
print (df)
                       A                      B
0    [sys1, sys2, user1]                [user1]
1  [user3, user6, user1]  [user3, user6, user1]
2     [sys1, sys2, sys3]                     []

或类似列表理解,如删除的答案:

df['B'] = [[item for item in l if item not in set(sys_list)] for l in df['A']]

或者将setset.difference一起使用的解决方案:

df['B'] = df['A'].map(set(sys_list).difference).map(list)

答案 2 :(得分:1)

您可以使用sets以获得更好的性能(此方法假设列表中的顺序并不重要,因为它会改变):

sys_set = set(['sys1', 'sys2', 'sys3'])

df['A'] = (df.A.map(set)-sys_set).map(list)

print(df)
                    A
0                [user1]
1  [user6, user1, user3]
2                     []