如何在Pandas DataFrame中迭代自增年份,计算各城市年度价格涨跌幅?
需求:计算各城市每年相对上一年的房价涨跌幅
现有数据与代码
import pandas as pd df = pd.DataFrame( [['New York', 1995, 160000], ['Philadelphia', 1995, 115000], ['Boston', 1995, 145000], ['New York', 1996, 167500], ['Philadelphia', 1996, 125000], ['Boston', 1996, 148000], ['New York', 1997, 180000], ['Philadelphia', 1997, 135000], ['Boston', 1997, 185000], ['New York', 1998, 200000], ['Philadelphia', 1998, 145000], ['Boston', 1998, 215000]], index = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12], columns = ['city', 'year', 'average_price']) def percent_change(d): y1995 = float(d['average_price'][d['year']==1995]) y1996 = float(d['average_price'][d['year']==1996]) ratio = str(round(((y1996 / y1995)-1)*100,2)) + '%' return ratio city = df[df['city']=='New York'] percent_change(city) my_final = {} for c in df['city'].unique(): city = df[df['city'] == c] my_final[c] = percent_change(city) print(my_final)
当前问题
目前仅能计算1995-1996单一年度的涨跌幅,结果如下:
{'New York': '4.69%', 'Philadelphia': '8.7%', 'Boston': '2.07%'}
无法迭代计算所有年份的涨跌幅,也未将年份与结果正确关联,需要实现每个城市每一年相对上一年的价格变化率计算,用于绘制折线图。
解决方案
利用Pandas的groupby按城市分组,再结合pct_change()方法直接计算环比涨跌幅,最后转换为百分比格式并保留两位小数:
import pandas as pd # 原始数据 df = pd.DataFrame( [['New York', 1995, 160000], ['Philadelphia', 1995, 115000], ['Boston', 1995, 145000], ['New York', 1996, 167500], ['Philadelphia', 1996, 125000], ['Boston', 1996, 148000], ['New York', 1997, 180000], ['Philadelphia', 1997, 135000], ['Boston', 1997, 185000], ['New York', 1998, 200000], ['Philadelphia', 1998, 145000], ['Boston', 1998, 215000]], index = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12], columns = ['city', 'year', 'average_price']) # 按城市分组,计算环比涨跌幅(数值型) df['price_change_pct'] = df.groupby('city')['average_price'].pct_change() * 100 # 转换为带百分比的字符串格式(可选,若用于绘图建议保留数值型) df['price_change_pct_str'] = df['price_change_pct'].round(2).astype(str) + '%' # 填充第一年的空值(无上年数据,标记为'-') df['price_change_pct_str'] = df['price_change_pct_str'].fillna('-') print(df)
输出结果
city year average_price price_change_pct price_change_pct_str 1 New York 1995 160000 NaN - 2 Philadelphia 1995 115000 NaN - 3 Boston 1995 145000 NaN - 4 New York 1996 167500 4.687500 4.69% 5 Philadelphia 1996 125000 8.695652 8.7% 6 Boston 1996 148000 2.068966 2.07% 7 New York 1997 180000 7.462687 7.46% 8 Philadelphia 1997 135000 8.000000 8.0% 9 Boston 1997 185000 24.324324 24.32% 10 New York 1998 200000 11.111111 11.11% 11 Philadelphia 1998 145000 7.407407 7.41% 12 Boston 1998 215000 16.216216 16.22%
关键说明
groupby('city')确保每个城市单独计算涨跌幅,不会跨城市混淆数据pct_change()默认计算当前行与前一行的比值变化,完全匹配"相对上一年"的需求- 若用于绘制折线图,建议使用
price_change_pct数值列,避免字符串格式导致绘图异常 - 第一年无上年数据,空值可根据需求填充为0或标记为无数据
内容的提问来源于stack exchange,提问作者user70282
相关产品推荐
相关产品推荐

