如何用for循环在Python DataFrame中新增多值列 解决全匹配首个if条件问题
问题根因
你的代码核心错误是循环内的判断逻辑操作的是整个DataFrame列,且调用了.any()方法:该方法会校验全列是否存在至少一个满足条件的值,只要有任意一行符合要求,整个判断就返回True,因此首个if条件永远成立,所有行都会被赋值为Top Buyers。
修正方案
方案1:修改原有循环逻辑
将判断对象从全列改为当前迭代的row,去掉不必要的.any()调用即可:
def CustomerSegmentClassifier(df): for i, row in df.iterrows(): if row['Recency'] <= 200 or row['Frequency'] >= 20: df.at[i,'Cluster Name'] = 'Top Buyers' elif (201 <= row['Recency'] <= 750) or (5 <= row['Frequency'] <= 19): df.at[i,'Cluster Name'] = 'Casual Buyers' else: df.at[i,'Cluster Name'] = 'Churned Buyers' return df
方案2:更高效的向量化实现(推荐)
Pandas优先推荐用向量化操作替代循环,执行效率更高、代码更简洁:
import numpy as np def CustomerSegmentClassifier(df): # 定义各层级判断条件 conditions = [ (df['Recency'] <= 200) | (df['Frequency'] >= 20), (df['Recency'].between(201, 750)) | (df['Frequency'].between(5, 19)) ] # 定义条件对应取值 values = ['Top Buyers', 'Casual Buyers'] # 生成新列,未匹配条件的默认赋值为'Churned Buyers' df['Cluster Name'] = np.select(conditions, values, default='Churned Buyers') return df
内容的提问来源于stack exchange,提问作者Anisha BharathSingh
相关产品推荐
相关产品推荐

