如何更新.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
相关产品推荐
相关产品推荐

