Python:如果数据帧列与字典键匹配,则返回新列的布尔值

Python: If dataframe column matches dictionary key then return boolean for new column

提问人:BeaverFever 提问时间:11/5/2023 最后编辑:BeaverFever 更新时间:11/5/2023 访问量:38

问:

我很难让它工作。所以总结一下:我有一个 DataFrame,我有一个字典,其中包含某个 DataFrame 值中某些值的键,如果它们匹配与否,我想创建一个 true/false 的新 DataFrame 列。

因此,下面是一个数据示例:

animal_list = ['dog', 'cat', 'dog', 'fish', 'bird', 'dog', 'bug', 'bird', 'snake']
animal_dict = {'dog': [3], 'bird': [2]}

animals = pd.DataFrame(animal_list, columns = ['Pets'])
animals

数据帧图像

基本上,我想要一个新列,如果它与键匹配,则带有布尔值 True,如果不匹配,则为 False。

或者,我想我可以完全跳过字典,如果我可以创建新列,并查询现有列中是否有多个值实例(“宠物”)。因此,对于狗和鸟来说,这是真的,但对于其他一切都是错误的。

更新:这是我使用的解决方案,供其他可能正在搜索它的人使用。我最初有这个功能,但使用的是 apply 方法而不是 map(如下面的 algebruh 所建议的)

def find_key(find_value):
    for k, v in animal_dict.items():
        if k == find_value:
            return True
    return False

animals['multiple'] = animals['Pets'].map(find_key)
python-3.x pandas 数据帧 字典

评论

0赞 algebruh 11/5/2023
可用于对 DataFrame 中的每个值调用函数,并在新 DataFrame 中收集结果。为了检查字符串是否是字典中的键,您可以编写animal.map(f)fss in animals_dict
0赞 BeaverFever 11/5/2023
好吧,我确实有一个用于实际数据集的函数,但我使用的是 .apply(),所以 .map() 现在确实有效。我只对匹配一列的值感兴趣,而不是对整个数据帧感兴趣,但这很简单。我将为其他人更新解决方案的 OP。
0赞 algebruh 11/5/2023
似乎也有效的是:。在这种情况下,您仅将其应用于目标列animal.apply({"Pets": lambda x : x in animal_dict})

答:

1赞 Nick 11/5/2023 #1

您可以简单地检查是否 isinanimals['Pets']animals_dict

animals['multiple'] = animals['Pets'].isin(animal_dict)

输出:

    Pets  multiple
0    dog      True
1    cat     False
2    dog      True
3   fish     False
4   bird      True
5    dog      True
6    bug     False
7   bird      True
8  snake     False

评论

0赞 BeaverFever 11/5/2023
是的,这也有效。我记得过去做过这样的事情,但记不清了。不过,出于某种原因,仍然想知道如何从字典中做到这一点。同样在我的实际数据集中,我使用 0 和 1,因此我可以进行 SMOTE 增强。
0赞 Nick 11/5/2023
@BeaverFever听起来你应该发布一个问题,其中包含你的实际数据集的片段;实际数据也可能进行优化。