You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:03:28