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

如何在Pandas中对特定年份列值相乘并解决shift(1)的NaT/NaN问题

解决Pandas中shift(1)引发的NaT/NaN问题(附两种场景的解决方案)

嘿,我来帮你搞定这个问题!首先咱们得先理清你遇到的问题根源:当你用shift(1)配合年份分组时,每组的第一行没有「上一行」数据,自然就会出现NaN(数值列)或者NaT(日期列)的缺失值。接下来我分两种最常见的场景给你具体的解决办法:

场景1:想计算某年份所有值的乘积,并把结果对应到该年的每一行

这种情况根本不需要用shift,直接用groupby+transform就能完美解决,完全不会产生缺失值。举个例子:

假设你的数据集有日期列date和数值列value,代码如下:

import pandas as pd

# 先确保日期列是datetime类型(这步很重要!避免年份提取出错)
df['date'] = pd.to_datetime(df['date'])
# 提取年份作为分组键
df['year'] = df['date'].dt.year

# 计算每年value的乘积,赋值给新列
df['annual_total_product'] = df.groupby('year')['value'].transform('prod')

这样处理后,同一年份的所有行都会拿到该年的总乘积,没有任何NaN。

场景2:想计算每行值与同年份上一行值的乘积

这种情况确实需要用到shift(1),但缺失值的问题可以用fillna来针对性填充,填充逻辑取决于你的业务需求:

方案A:如果希望每组第一行的乘积就是它本身(乘以1)

# 按年份分组,获取上一行的value
df['prev_year_value'] = df.groupby('year')['value'].shift(1)
# 用1填充NaN,这样第一行就是 value * 1 = value本身
df['product_with_prev'] = df['value'] * df['prev_year_value'].fillna(1)

方案B:如果希望每组第一行的乘积等于该组第一个值(比如保持和自身一致)

# 用组内第一个值填充shift后的缺失
df['product_with_prev'] = df.groupby('year')['value'].apply(
    lambda x: x * x.shift(1).fillna(x.iloc[0])
)

额外注意事项

  • 如果是日期列出现NaT,处理逻辑和数值列一致:用fillna填充每组的第一个日期即可,比如:
    df['prev_date'] = df.groupby('year')['date'].shift(1).fillna(df.groupby('year')['date'].transform('first'))
    
  • 先检查分组是否正确:可以用print(df.groupby('year').groups)查看分组结果,避免因为年份提取错误(比如日期列不是datetime类型)导致分组混乱,进而引发更多问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:01:01