如何在Pandas DataFrame中按多条件判断生成good_day标识列
错误原因
- 原有代码是分别给满足单个条件的行赋值1,实现的是「满足任意一个条件就标记为1」的或逻辑,不符合要求的「三个条件同时满足才标记为1」的且逻辑
- 最后一行
df['good_day'] = df.where(df['temperatur'].between(15, 25), 1)写法错误,直接将整行DataFrame的值赋值给了good_day列,导致输出结果异常
正确实现
推荐两种常见写法:
写法1:布尔值直接转整数(最简洁)
import pandas as pd d = {'sunshine': [8, 9, 6, 5], 'rain': [2, 4, 0, 8], 'temperatur': [22, 32, -12, 4], 'id': [1, 2, 3, 4]} df = pd.DataFrame(data=d) # *注意三个判断条件都需要加括号,避免Python运算符优先级问题导致报错 df['good_day'] = ( (df['sunshine'] >= 8) & (df['rain'] <= 3) & (df['temperatur'].between(15, 25)) ).astype(int) print(df)
写法2:loc赋值(逻辑更直观)
df['good_day'] = 0 # 先构造同时满足三个条件的掩码 mask = (df['sunshine'] >= 8) & (df['rain'] <= 3) & (df['temperatur'].between(15,25)) # 仅给满足条件的行赋值1 df.loc[mask, 'good_day'] = 1
输出结果
sunshine rain temperatur id good_day 0 8 2 22 1 1 1 9 4 32 2 0 2 6 0 -12 3 0 3 5 8 4 4 0
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

