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

如何更新.loc查询结果的指定行?解决DataFrame日合计列赋值问题

解决DataFrame按日期分组后仅在最后一行添加当日time_sum总和的问题

我完全懂你的需求——给每个日期的打卡记录组,只在最后一行补上当日所有time_sum的总和,其他行留空(NaT)。先说说你遇到的问题:你之前操作的是原DataFrame的切片副本,所以修改不会同步到原数据,还触发了SettingWithCopyWarning,这是Pandas在提醒你操作对象不对。

单个日期的精准处理方式

如果你只需要处理某一个特定日期(比如Date=2),可以先拿到该组最后一行的原始索引,再用.loc直接定位原DataFrame的行和列赋值:

# 获取Date=2的所有行的索引
date_2_indices = df_03[df_03['Date'] == 2].index
# 提取该组最后一行的索引
last_idx = date_2_indices[-1]
# 计算该日期的time_sum总和
total_time = df_03.loc[date_2_indices, 'time_sum'].sum()
# 直接给原DataFrame的对应位置赋值
df_03.loc[last_idx, 'day_sum'] = total_time

这种方式完全避开了副本操作,修改会直接作用在原DataFrame上,不会触发警告。

高效批量处理所有日期的方法

如果你的DataFrame里有多个日期,一个个处理太繁琐,用groupby结合transform可以一次性搞定所有分组:

# 先初始化day_sum列为NaT
df_03['day_sum'] = pd.NaT

# 计算每个Date分组的time_sum总和
grouped_total = df_03.groupby('Date')['time_sum'].transform('sum')

# 标记每个分组的最后一行
is_last_row = df_03.groupby('Date').cumcount(ascending=False) == 0

# 仅在每组最后一行赋值总和,其余保持NaT
df_03.loc[is_last_row, 'day_sum'] = grouped_total[is_last_row]

简单解释下逻辑:

  • cumcount(ascending=False)会给每个分组的行从最后一行开始计数(最后一行是0,倒数第二是1),判断等于0就能精准筛选出每组的最后一行。
  • 用.loc直接定位这些行,把对应的分组总和赋值过去,完美匹配你的预期效果。

为什么你之前的方法失效?

你之前写的df_03.loc[df_03['Date'] == 2].iloc[-1]返回的是原DataFrame的切片副本,不是原数据的视图——相当于你复制了一份数据修改,原数据自然不会有变化。Pandas抛出的警告其实已经给了提示:要用.loc[row_indexer, col_indexer]的方式直接操作原数据。

内容的提问来源于stack exchange,提问作者Judge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:42:46