如何移动Pandas列中指定位置的值至目标位置?实操求助
问题分析
首先看你的需求:需要把Time列的最后两个值(23、28)移动到A=21对应的行(也就是原DataFrame的第3行,索引为2)开始的位置,同时把原来从这个位置开始的三个值(5、2、0)往后顺延。你的原始代码有几个明显问题:
- 误操作了
I列而非目标的Time列,完全搞错了修改对象; - 链式索引赋值(
tmp['I'][2:4])会触发SettingWithCopyWarning,而且会直接覆盖原始值,导致后续赋值时拿不到初始的目标数据; - 赋值顺序逻辑错误,先把后段值覆盖前段,再用修改后的前段值去替换后段,最终结果肯定不对。
正确实现方法
这里提供两种简洁可靠的实现方式,你可以根据习惯选择:
方法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
相关产品推荐
相关产品推荐

