Pandas 列表列,检查列表是否相交

我有一个名为 的数据框,a其结构如下:


df = pd.DataFrame({

    'id': [1, 2, 3],

    'numbers_a': [[2, 3, 5], [1, 2, 4], [4, 6, 9]],

    'numbers_b': [[2, 1, 3], [10, 11], [4, 5, 7]]

})

df


| id | numbers_a | numbers_b |

|----|-----------|-----------|

| 1  | [2, 3, 5] | [2, 1, 3] |

| 2  | [1, 2, 4] | [10, 11]  |

| 3  | [4, 6, 9] | [4, 5, 7] | 

我想向该数据框添加一个名为 的新列,如果 中的任何一个值在中result,则应该是该列。因此,以下应该是结果数据框:TRUEnumbers_bnumbers_a


| id | numbers_a | numbers_b | result |

|----|-----------|-----------|--------|

| 1  | [2, 3, 5] | [2, 1, 3] | TRUE   |

| 2  | [1, 2, 4] | [10, 11]  | FALSE  |

| 3  | [4, 6, 9] | [4, 5, 7] | TRUE   | 

我尝试使用以下代码片段,但所有值都为 FALSE:


a['result'] = pd.DataFrame(a.numbers_b.tolist()).isin(a.numbers_a).any(1).astype(bool)

我该如何解决这个问题?提前致谢。


波斯汪
浏览 144回答 1
1回答

慕无忌1623718

尝试设置交集:df['numbers_a'].map(set) & df['numbers_b'].map(set)0     True1    False2     Truedtype: bool这对于重载的 pandas 布尔运算符效果很好,尽管它的性能不是特别好。另一种方法涉及列表理解:[set(a).intersection(b) for a, b in zip(df['numbers_a'], df['numbers_b'])]# [True, False, True]# To assign the result backdf['result'] = [    set(a).intersection(b) for a, b in zip(df['numbers_a'], df['numbers_b'])]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python