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

如何移动Pandas列中指定位置的值至目标位置?实操求助

问题分析

首先看你的需求:需要把Time列的最后两个值(23、28)移动到A=21对应的行(也就是原DataFrame的第3行,索引为2)开始的位置,同时把原来从这个位置开始的三个值(5、2、0)往后顺延。你的原始代码有几个明显问题:

  1. 误操作了I列而非目标的Time列,完全搞错了修改对象;
  2. 链式索引赋值(tmp['I'][2:4])会触发SettingWithCopyWarning,而且会直接覆盖原始值,导致后续赋值时拿不到初始的目标数据;
  3. 赋值顺序逻辑错误,先把后段值覆盖前段,再用修改后的前段值去替换后段,最终结果肯定不对。

正确实现方法

这里提供两种简洁可靠的实现方式,你可以根据习惯选择:

方法1:拆分重组列表(直观易懂)

把Time列转换成普通列表,按需求拆分后重新拼接,再赋值回DataFrame:

import pandas as pd

# 构造你的原始DataFrame
df = pd.DataFrame({
    'A': [7,14,21,28,35,42,49],
    'I': [3,2,5,7,3,0,-1],
    'Time': [7,6,5,2,0,23,28]
})

# 拆分Time列表并按需求重组
time_vals = df['Time'].tolist()
new_time = time_vals[:2] + time_vals[-2:] + time_vals[2:-2]

# 赋值回Time列
df['Time'] = new_time

方法2:索引精准赋值(贴合Pandas风格)

先保存需要交换的两段原始数据(必须用copy()避免引用传递),再通过索引定位到目标位置完成赋值:

import pandas as pd

df = pd.DataFrame({
    'A': [7,14,21,28,35,42,49],
    'I': [3,2,5,7,3,0,-1],
    'Time': [7,6,5,2,0,23,28]
})

# 保存需要移动的两段原始数据
last_two_time = df['Time'].iloc[-2:].copy()
original_middle = df['Time'].iloc[2:5].copy()

# 执行赋值替换
df.loc[df.index[2:4], 'Time'] = last_two_time.values
df.loc[df.index[4:7], 'Time'] = original_middle.values

运行结果

两种方法都会得到你想要的目标DataFrame:

A  I  Time
0   7  3     7
1  14  2     6
2  21  5    23
3  28  7    28
4  35  3     5
5  42  0     2
6  49 -1     0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:07:48