如何按行列遍历DataFrame并计算年度增长率?
计算DataFrame年度增长率问题
需要为如下结构的DataFrame计算年度增长率,按行按列遍历的环节卡住了。
原始DataFrame
City 2001 2002 2003 New York 20.0 24.1 28.7 Los Angeles 11.1 12.1 13.1
期望结果
City 2001 2002 2003 New York nan 0.20 0.19 Los Angeles nan 0.10 0.09
注:期望结果中Los Angeles的2003年增长率应为(13.1-12.1)/12.1≈0.09,原示例的0.8应为笔误
尝试的Python代码
for row in range(len(import_table)): for i in column_list: if i == "_2000": pass else: calculated_growth = import_table.iloc[i].sub(import_table.iloc[i-1]) ## update new DF ## column_calc_position = column_calc_position + 1
解决方案
推荐方法:用Pandas内置函数pct_change()
Pandas提供了专门计算增长率的方法,无需手动遍历,效率更高:
import pandas as pd # 构造原始数据 data = { 'City': ['New York', 'Los Angeles'], '2001': [20.0, 11.1], '2002': [24.1, 12.1], '2003': [28.7, 13.1] } import_table = pd.DataFrame(data) # 计算增长率 # 1. 将City设为索引,只对年份列计算 # 2. pct_change(axis=1)按行计算后一列相对前一列的增长率 # 3. 重置索引恢复City列 growth_df = import_table.set_index('City').pct_change(axis=1).reset_index() # 保留两位小数对齐期望结果 growth_df = growth_df.round(2) print(growth_df)
执行后输出:
City 2001 2002 2003 0 New York NaN 0.20 0.19 1 Los Angeles NaN 0.10 0.09
手动遍历的修正版本
如果想理解循环逻辑,修正后的代码如下(注意Pandas优先用向量运算而非逐行循环):
import pandas as pd data = { 'City': ['New York', 'Los Angeles'], '2001': [20.0, 11.1], '2002': [24.1, 12.1], '2003': [28.7, 13.1] } import_table = pd.DataFrame(data) # 初始化结果表,保留City列 growth_df = import_table[['City']].copy() # 提取所有年份列 year_cols = [col for col in import_table.columns if col != 'City'] # 遍历年份列,从第2列开始(索引1) for idx in range(1, len(year_cols)): prev_col = year_cols[idx-1] curr_col = year_cols[idx] # 整列计算增长率:(当年值-上年值)/上年值 growth_df[curr_col] = (import_table[curr_col] - import_table[prev_col]) / import_table[prev_col] # 第一列设为NaN growth_df[year_cols[0]] = float('nan') # 调整列顺序和原始表一致 growth_df = growth_df[['City'] + year_cols] # 保留两位小数 growth_df = growth_df.round(2) print(growth_df)
内容的提问来源于stack exchange,提问作者Jeremiah Taylor
相关产品推荐
相关产品推荐

