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

按grid100分组计算nights增长率报错:ValueError维度不匹配

问题解决方法

错误原因

你之前的代码存在两个核心问题:

  1. df.assign(...)会返回包含所有原列+新列的完整DataFrame,而df['rate_growth']需要的是一维数组,直接赋值就会触发维度不匹配的报错。
  2. 默认的pct_change()是计算每行相对于前一行的相邻变化率,不是你需要的「1992年到2000年的跨期增长率」,即使维度问题解决,结果也不符合需求。

正确实现方案

以下三种方法可根据你的数据情况选择:

方法一:分组后直接计算跨期增长率

适合已确认每个grid100都有1992和2000年数据的场景:

# 筛选出1992和2000年的数据子集
filtered_df = df[df['year'].isin([1992, 2000])]

# 按grid100分组,计算(2000年nights - 1992年nights)/1992年nights
growth_rates = filtered_df.groupby('grid100').apply(
    lambda group: (group[group['year'] == 2000]['nights'].iloc[0] - group[group['year'] == 1992]['nights'].iloc[0]) 
    / group[group['year'] == 1992]['nights'].iloc[0]
).reset_index(name='rate_growth')

# 将增长率合并回原数据框
df = df.merge(growth_rates, on='grid100', how='left')

方法二:用透视表转换结构后计算

逻辑更直观,适合需要查看两年数据对比的场景:

# 生成透视表,每个grid100对应1992、2000年的nights值
pivot_df = df.pivot_table(index='grid100', columns='year', values='nights').reset_index()

# 计算增长率并保留需要的列
pivot_df['rate_growth'] = (pivot_df[2000] - pivot_df[1992]) / pivot_df[1992]
growth_rates = pivot_df[['grid100', 'rate_growth']]

# 合并回原数据框
df = df.merge(growth_rates, on='grid100', how='left')

方法三:利用pct_change取组内最终值

如果数据已按grid100和year升序排列(1992在前、2000在后),可简化操作:

# 先确保数据按grid100和年份升序排列
df = df.sort_values(['grid100', 'year'])

# 按grid100分组计算相邻变化率,取每个组的最后一个值(即2000相对1992的增长率)
growth_rates = df.groupby('grid100')['nights'].pct_change()\
                .groupby('grid100').last()\
                .reset_index(name='rate_growth')

# 合并回原数据框
df = df.merge(growth_rates, on='grid100', how='left')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:05:32