我有一个看起来像这样的DataFrame:
part price date
1 67.32 2018-12-01 00:00:00.000
3 99.16 2018-12-01 00:00:00.000
1 67.32 2018-11-01 00:00:00.000
3 167.34 2018-11-01 00:00:00.000
1 67.32 2018-10-01 00:00:00.000
3 167.34 2018-10-01 00:00:00.000
1 88.37 2018-09-01 00:00:00.000
3 212.70 2018-09-01 00:00:00.000
1 88.37 2018-08-01 00:00:00.000
3 264.02 2018-08-01 00:00:00.000
1 88.37 2018-07-01 00:00:00.000
3 264.02 2018-07-01 00:00:00.000
我想创建一个新列,称为
price_change
,该列跟踪价格如何逐月变化。因此,以上内容将变为:part price date price_change
1 67.32 2018-12-01 00:00:00.000 0.0
3 99.16 2018-12-01 00:00:00.000 -68.18
1 67.32 2018-11-01 00:00:00.000 0.0
3 167.34 2018-11-01 00:00:00.000 0.0
1 67.32 2018-10-01 00:00:00.000 -21.05
3 167.34 2018-10-01 00:00:00.000 -45.36
1 88.37 2018-09-01 00:00:00.000 0.0
3 212.70 2018-09-01 00:00:00.000 -51.32
1 88.37 2018-08-01 00:00:00.000 0.0
3 264.02 2018-08-01 00:00:00.000 0.0
1 88.37 2018-07-01 00:00:00.000 0.0
3 264.02 2018-07-01 00:00:00.000 0.0
如果到达最早的日期,
price_change
应该仅为0。我已经尝试过排序和使用pd.DataFrame.diff,如下所示:
df.sort_values(by=['part', 'date'])
df['price_change'] = df['price'].diff()
与fillna一起几乎可以使用。问题在于,每次到达新零件时,这不会重新开始差异计算。
最佳答案
只需sort_values
和groupby
然后找到差异:
df['diff'] = df.sort_values('date').groupby('part')['price'].diff().fillna(0)
part price date diff
0 1 67.32 2018-12-01 0.00
1 3 99.16 2018-12-01 -68.18
2 1 67.32 2018-11-01 0.00
3 3 167.34 2018-11-01 0.00
4 1 67.32 2018-10-01 -21.05
5 3 167.34 2018-10-01 -45.36
6 1 88.37 2018-09-01 0.00
7 3 212.70 2018-09-01 -51.32
8 1 88.37 2018-08-01 0.00
9 3 264.02 2018-08-01 0.00
10 1 88.37 2018-07-01 0.00
11 3 264.02 2018-07-01 0.00
关于python - Pandas 根据另一列跟踪价格的每月变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54471034/