查询8月平均气温高于22度的日期 修正现有pandas代码问题
问题分析与代码修正
原代码存在的问题
- 直接给
df动态赋值eight属性的写法不规范,容易和DataFrame的原生属性、列名冲突,更推荐单独定义变量存储8月份的子集 - 循环逻辑错误:
for i in df.eight遍历的是DataFrame的列名而非行数据,且avg是整个8月平均气温的Series对象,直接和22比较会返回布尔Series,无法直接用在if判断中 - 打印逻辑错误:
print('date')是打印固定字符串date,不是输出符合条件的日期变量值 - 存在冗余导入:
datetime和matplotlib库在当前需求中未被使用,可以直接删除
修正方案
推荐写法(pandas向量化操作,执行效率更高)
无需手动遍历行,利用pandas原生布尔索引直接完成筛选,逻辑简洁、适合处理任意规模的数据集:
import pandas as pd path = 'https://github.com/dknife/ML/raw/main/data/' file = path+'weather.csv' df = pd.read_csv(file, encoding='CP949') df.columns = ['date','Average temperature', 'Maximum wind speed', 'Average wind speed'] df['date'] = pd.to_datetime(df['date'], format = "%Y-%m-%d") # 构建筛选条件:8月份 + 平均气温高于22摄氏度 filter_condition = (df['date'].dt.month == 8) & (df['Average temperature'] > 22) # 提取符合条件的日期列 result_dates = df.loc[filter_condition, 'date'] # 打印所有符合要求的日期 for date in result_dates: print(date) # 如需直接获得日期列表可使用:result_dates.tolist()
原循环逻辑修正版(仅作错误对照参考,不推荐生产环境使用)
如果需要保留手动遍历的写法,修正后代码如下:
import pandas as pd path = 'https://github.com/dknife/ML/raw/main/data/' file = path+'weather.csv' df = pd.read_csv(file, encoding='CP949') df.columns = ['date','Average temperature', 'Maximum wind speed', 'Average wind speed'] df['date'] = pd.to_datetime(df['date'], format = "%Y-%m-%d") eight = 8 # 单独定义变量存储8月子集,不挂载到df对象上 august_df = df.query('date.dt.month == @eight') # 遍历DataFrame的每一行数据 for _, row in august_df.iterrows(): if row['Average temperature'] >= 22.0: # 输出当前行的日期值,而非固定字符串 print(row['date'])
内容的提问来源于stack exchange,提问作者si1203
相关产品推荐
相关产品推荐

