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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:57:33