使用Pandas计算日期区间平均温湿度时结果重复的问题排查
问题分析与解决
错误原因
- 循环赋值逻辑错误:你在for循环里每次执行
df3["Season avg temp"] = ...时,是把计算得到的单个平均值赋值给整个列,而非当前循环对应的行。循环结束后,所有行都会被最后一次循环的计算结果覆盖,因此所有行的值完全相同。 - style.format代码无效:
df.style.format(...)这类代码仅用于格式化DataFrame的显示样式,不会修改原DataFrame的实际数据,这部分代码可直接删除,不影响计算逻辑。
修正方案
方案一:使用apply逐行计算(推荐,符合Pandas向量化操作习惯)
import pandas as pd # 读取数据 df = pd.read_csv(r'C:\climate.csv') df3 = pd.read_csv(r'C:\Flower_weight_Seson.csv') # 转换日期格式 df['date'] = pd.to_datetime(df.date) df3['Harvest_date'] = pd.to_datetime(df3.Harvest_date) df3['Starting_date'] = pd.to_datetime(df3.Starting_date) # 定义单季平均值计算函数 def calculate_season_avg(row): # 筛选当前行时间区间内的气候数据 time_mask = df['date'].between(row['Starting_date'], row['Harvest_date']) avg_temp = df.loc[time_mask, 'temp'].mean() avg_humid = df.loc[time_mask, 'humid'].mean() return pd.Series([avg_temp, avg_humid], index=['Season avg temp', 'Season avg humid']) # 应用函数到df3每一行,生成结果列 df3[['Season avg temp', 'Season avg humid']] = df3.apply(calculate_season_avg, axis=1)
方案二:修正循环逻辑,按索引赋值
如果坚持使用循环,需通过索引定位到对应行,避免覆盖整列:
import pandas as pd df = pd.read_csv(r'C:\climate.csv') df3 = pd.read_csv(r'C:\Flower_weight_Seson.csv') df['date'] = pd.to_datetime(df.date) df3['Harvest_date'] = pd.to_datetime(df3.Harvest_date) df3['Starting_date'] = pd.to_datetime(df3.Starting_date) # 先初始化结果列 df3["Season avg temp"] = None df3["Season avg humid"] = None # 循环时通过索引定位到当前行赋值 for idx, (harvest_date, starting_date) in enumerate(zip(df3['Harvest_date'], df3['Starting_date'])): time_mask = df["date"].between(starting_date, harvest_date) df3.loc[idx, "Season avg temp"] = df.loc[time_mask, "temp"].mean() df3.loc[idx, "Season avg humid"] = df.loc[time_mask, "humid"].mean()
内容的提问来源于stack exchange,提问作者Stetco Oana
相关产品推荐
相关产品推荐

