Pandas实现:仅在DataFrame最后一行添加日均水位损失值
问题
现有如下结构的DataFrame:
Day water level Avg loss per day 1 100 NaN 2 90 NaN 3 88 NaN 4 87 NaN 5 77 NaN 6 75 NaN 7 74 (100-74)/7
需要在第三列Avg loss per day中计算日均水位损失值,要求仅最后一行有值,其余6行保持NaN。尝试使用.iloc和np.nan编写代码时出现报错,询问是否有不使用.iloc的实现方法。
尝试的代码如下:
df['Avg loss per day']=(df['water level'].iloc[0]-df['water level'].iloc[6])/7 df = df.round({'Avg loss per day': 2}) df.loc[0:6,['Avg loss per day']]=np.nan
解决方案
以下是几种不用.iloc的实现方式:
方法1:通过索引首尾定位赋值
直接利用DataFrame的索引定位第一行和最后一行,先把整列设为NaN,再给最后一行赋值:
import numpy as np import pandas as pd # 计算日均损失:(初始水位-最终水位)/天数 avg_loss = (df.loc[df.index[0], 'water level'] - df.loc[df.index[-1], 'water level']) / len(df) # 初始化整列为NaN df['Avg loss per day'] = np.nan # 给最后一行赋值并保留两位小数 df.loc[df.index[-1], 'Avg loss per day'] = round(avg_loss, 2)
方法2:用head/tail定位首尾行
用head(1)和tail(1)分别获取第一行和最后一行的水位值,再完成赋值:
# 计算日均损失 initial_level = df['water level'].head(1).item() final_level = df['water level'].tail(1).item() avg_loss = (initial_level - final_level) / len(df) # 初始化整列为NaN,再给最后一行赋值 df['Avg loss per day'] = np.nan df.loc[df.tail(1).index, 'Avg loss per day'] = round(avg_loss, 2)
原代码报错原因分析
你原来的代码先给整列赋值计算结果,再尝试将前7行设为NaN,但如果你的DataFrame索引是Day列的数值(即索引为1-7),那么df.loc[0:6]会找不到对应行,导致赋值失败。改用索引本身或head/tail定位,能避免索引不匹配的问题。
内容的提问来源于stack exchange,提问作者firdous
相关产品推荐
相关产品推荐

