按grid100分组计算nights增长率报错:ValueError维度不匹配
问题解决方法
错误原因
你之前的代码存在两个核心问题:
df.assign(...)会返回包含所有原列+新列的完整DataFrame,而df['rate_growth']需要的是一维数组,直接赋值就会触发维度不匹配的报错。- 默认的
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
相关产品推荐
相关产品推荐

