python - 使用分组依据的 Pandas 百分比变化

标签 python pandas dataframe

假设我有以下数据帧:

df = pd.DataFrame({'city': ['a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd'], 
                   'year': [2013, 2014, 2016, 2015, 2016, 2013, 2016, 2017, 2018],
                  'value': [10, 12, 16, 20, 21, 11, 15, 13, 16]})
我想找出每个城市和年份的值(value)与前一年相比的百分比变化。我的最终数据框将是:
city  year  value
   a  2013    NaN
   a  2014   0.20
   a  2016    NaN
   b  2015    NaN
   b  2016   0.05
   c  2013    NaN
   d  2016    NaN
   d  2017  -0.14
   d  2018   0.23
我尝试在城市中使用一个组,然后使用 apply 但它没有用:
df.groupby('city').apply(lambda x: x.sort_values('year')['value'].pct_change()).reset_index()
它没有用,因为我无法得到年份,也因为这样我正在考虑所有城市的所有年份,但事实并非如此。
编辑:我不太关心效率,所以任何解决问题的解决方案对我都是有效的。

最佳答案

让我们试试懒惰 groupby() , 使用 pct_change更改和 diff检测年份跳跃:

groups = df.sort_values('year').groupby(['city'])

df['pct_chg'] = (groups['value'].pct_change()
                    .where(groups['year'].diff()==1)
                )
输出:
  city  year  value   pct_chg
0    a  2013     10       NaN
1    a  2014     12  0.200000
2    a  2016     16       NaN
3    b  2015     20       NaN
4    b  2016     21  0.050000
5    c  2013     11       NaN
6    d  2016     15       NaN
7    d  2017     13 -0.133333
8    d  2018     16  0.230769

关于python - 使用分组依据的 Pandas 百分比变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67625491/

相关文章:

python - 从列表中的单个元素中减去?

python - 并行化 Pandas 应用

python - 将 int64 转换为日期时间,格式为 %H :%M'

python - 视觉分离 Pandas 中的条形图集群

python - pandas.DataFrame.replace,对于第一列

python - 如何用scipy优化n个点的位置?

python - 无法让多处理工作

Python pandas 连接列 csv

python - 推特 API : How to search tweets based on query words and predetermined time span + tweets characteristics

python - Pandas 版的 rbind