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

如何在同一Pandas DataFrame中实现切片间减法并得到正确结果?

解决Pandas切片相减出现NaN的问题

嘿,这个问题我之前也踩过坑!核心原因是Pandas在执行运算时会严格按索引对齐,咱们来理清楚问题出在哪,再给你几个靠谱的解决方案:

为什么会出现NaN?

你用到的两个切片:

  • df[1:]的索引是[1, 2]
  • df[:-1]的索引是[0, 1]

当你直接相减时,Pandas只会匹配索引相同的行——只有索引1的位置能对应上,其他索引(0和2)没有匹配项,所以就会填充NaN,这就是你看到结果的原因。

解决方案

方法1:用Pandas内置的diff()方法(最推荐)

diff()就是专门用来计算相邻行/列差值的方法,默认是后一行减前一行,完美符合你的需求。如果想要和目标结果的索引一致,只需要去掉第一行的NaN再重置索引:

import pandas as pd
df = pd.DataFrame(data={'col1': [1, 2, 3], 'col2': [3, 4, 5]})

# 计算差值并处理索引
result = df.diff().dropna().reset_index(drop=True)
print(result)

输出结果:

col1  col2
0   1.0   1.0
1   1.0   1.0

方法2:重置切片的索引再相减

如果不想用内置方法,也可以手动把两个切片的索引重置为从0开始,这样它们就能完全对齐:

result = df[1:].reset_index(drop=True) - df[:-1].reset_index(drop=True)
print(result)

这个方法逻辑更直观,适合理解Pandas的索引对齐机制,也能直接得到你想要的结果。

方法3:用shift()实现行偏移相减

shift(1)会把整个DataFrame向下偏移一行(第一行变成NaN),然后用原DataFrame减去偏移后的结果,再取有效行并重置索引:

result = (df - df.shift(1))[1:].reset_index(drop=True)
print(result)

这个方法和diff()的原理类似,也是利用行偏移来实现相邻行的差值计算。

总结

如果只是需要计算相邻行的差值,优先用diff(),它是Pandas专门优化过的方法,代码简洁且效率高。如果想手动控制索引对齐,重置索引的方法也很实用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:35:00