我正在尝试使用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的值。有人可以告诉我为什么吗?
答案 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'})