Python多条件判断创建season变量为何所有值均为spring?
问题根因
- 逻辑表达式写法错误:Python中
or运算符会从左到右判断布尔值,只要遇到真值就直接返回结果。你写的'september' or 'october' or 'november' in labels['str_date']会先判断非空字符串'september'的布尔值,结果恒为True,所以第一个if条件永远成立,所有行的season直接被赋值为spring,后续条件根本不会生效。 - 未实现逐行匹配:你直接对整个
labels['season']列批量赋值,没有逐行判断str_date的内容,就算条件写对也只会给全列赋同一个值。 - 分支逻辑错误:你使用了多个独立的
if而非elif,就算前面的条件触发,后续的if依然会运行,可能覆盖之前的赋值;且末尾的else只会和最后一个if绑定,前面的分支不会触发else逻辑。 - 额外拼写错误:代码中
febuary拼写错误,正确拼写为february,会导致匹配不到对应月份。
修正方案
推荐使用pandas向量化方法str.contains配合numpy.select实现批量匹配,性能远高于逐行遍历:
import numpy as np # 按顺序定义季节匹配规则,用正则或逻辑匹配多个月份 conditions = [ # 匹配9/10/11月,case=False忽略大小写 labels['str_date'].str.contains('september|october|november', case=False), # 匹配12/1/2月 labels['str_date'].str.contains('december|january|february', case=False), # 匹配3/4/5月 labels['str_date'].str.contains('march|april|may', case=False), # 匹配6/7/8月 labels['str_date'].str.contains('june|july|august', case=False) ] # 按条件顺序对应季节取值 season_values = ['spring', 'summer', 'autumn', 'winter'] # 生成新列,未匹配到的默认赋值为null labels['season'] = np.select(conditions, season_values, default='null') # 绘图 sns.countplot(x='season', data=labels) plt.show()

内容的提问来源于stack exchange,提问作者Helena
相关产品推荐
相关产品推荐

