比较两个列表并使用结果添加新列

2024-10-02 00:35:44 发布

您现在位置:Python中文网/ 问答频道 /正文

比较两个列表并添加findKB不同的新列

df = pd.DataFrame({'A': [['10', '20', '30', '40'],['50', '60', '70', '80']], 
               'B': [['a', 'b'],['c','d']]})
findKBs = ['10','90']


                  A       B
0  [10, 20, 30, 40]  [a, b]
1  [50, 60, 70, 80]  [c, d]

这将是理想的行为

                  A       B         C
0  [10, 20, 30, 40]  [a, b]      [90]
1  [50, 60, 70, 80]  [c, d]   [10,90]

提前谢谢


Tags: dataframedf列表pd理想findkbsfindkb
3条回答

来自set的子对象

df['C']=(set(findKBs)-df.A.map(set)).map(list)
df
Out[253]: 
                  A       B         C
0  [10, 20, 30, 40]  [a, b]      [90]
1  [50, 60, 70, 80]  [c, d]  [10, 90]

您可以在此处使用^{}尝试此操作

df['C'] = df['A'].map(lambda x: np.setdiff1d(findKBs,x))

                  A       B         C
0  [10, 20, 30, 40]  [a, b]      [90]
1  [50, 60, 70, 80]  [c, d]  [10, 90]

为了避免lambda,您可以在这里使用^{}

from functools import partial
diff = partial(np.setdiff1d, findKBs)

df['C'] = df['A'].map(diff)

我们可以使用^{}

df['C'] = [find_kb[~np.isin(find_kb, a)] 
           for a, find_kb in zip(df['A'], np.array([findKBs] * len(df)))]
print(df) 
                  A       B         C
0  [10, 20, 30, 40]  [a, b]      [90]
1  [50, 60, 70, 80]  [c, d]  [10, 90]

或者我们可以使用filter

df['C'] = [list(filter(lambda val: val not in a, find_kb))
           for a, find_kb in zip(df['A'],[findKBs] * len(df))]

#df['C'] = df['A'].map(lambda list_a: list(filter(lambda val: val not in list_a, 
#                                                 findKBs)
#                                         )
#                     )

filter更难阅读,但效率更高:

%%timeit
df['C'] = [list(filter(lambda val: val not in a, find_kb))
           for a, find_kb in zip(df['A'],[findKBs] * len(df))]

194 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)



%%timeit
df['C'] = [find[~np.isin(find, a)] for a, find in zip(df['A'], np.array([findKBs] * len(df)))]
334 µs ± 38.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
df['C'] = df['A'].map(lambda x: np.setdiff1d(findKBs,x))
534 µs ± 17.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

相关问题 更多 >

    热门问题