对于循环分配一个值,何时应分配两个值

时间:2019-03-10 13:18:03

标签: python pandas

我正在尝试使用for循环根据另一列的值为列分配两个值之一。我创建了要分配给一个元素的项目列表,使用其他元素分配了其他元素。但是,我的代码仅将else值分配给该列。我也尝试过elif,但没有用。这是我的代码:

#create list of aggressive reasons
aggressive = ['AGGRESSIVE - ANIMAL', 'AGGRESSIVE - PEOPLE', 'BITES']

#create new column assigning 'Aggressive' or 'Not Aggressive'
for reason in top_dogs_reason['Reason']:
    if reason in aggressive:
        top_dogs_reason['Aggression'] = 'Aggressive'
    else:
        top_dogs_reason['Aggression'] = 'Not Aggressive'

我的新列top_dogs_reason ['Aggression']仅具有Not Aggressive的值。有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:1)

您应该使用loc来分配诸如此类的东西,以隔离要更新的数据框的一部分。第一行在“ Aggression”列中获取值,其中“ Reason”列中的值包含在列表“ aggressive1”中。第二行在“原因”列中找到其 not 的位置。

top_dogs_reason[top_dogs_reason['Reason'].isin(aggressive), 'Aggression'] = 'Aggressive'
top_dogs_reason[~top_dogs_reason['Reason'].isin(aggressive), 'Aggression'] = 'Not Aggressive'

或Roganjosh解释的一行使用np.where,这很像excel if / else语句。所以在这里我们要说的是,如果理由是侵略性的,给我们“侵略性”,否则给我们“不侵略性”,并将其分配给“侵略性”列:

top_dogs_reason['Aggression'] = np.where(top_dogs_reason['Reason'].isin(aggressive), "Aggressive", "Not Aggressive")

或anky_91的答案,该答案使用.map映射值。这是将字典提供给pandas系列的一种有效方法,对于该系列中的每个值,它都会查看字典中的键并返回相应的值:

top_dogs_reason['reason'].isin(aggressive).map({True:'Aggressive',False:'Not Aggressive'})