熊猫根据另一列跟踪价格的每月变化

时间:2019-02-01 00:01:40

标签: python pandas dataframe

我有一个看起来像这样的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一起使用几乎可以正常工作。问题在于,每次到达新零件时,这不会重新开始差异计算。

1 个答案:

答案 0 :(得分:1)

只需sort_valuesgroupby然后找到差异:

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