我有一个数据框:
np.random.seed(1)df1 = pd.DataFrame({'day':[3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6], 'item': [1, 1, 2, 2, 1, 2, 3, 3, 4, 3, 4], 'price':np.random.randint(1,30,11)})
day item price0 3 1 61 4 1 122 4 2 133 4 2 94 5 1 105 5 2 126 5 3 67 5 3 168 5 4 19 6 3 1710 6 4 2
在执行分组代码 gb = df1.groupby(['day','item'])['price'].mean()
后,我得到:
gb day item3 1 64 1 12 2 115 1 10 2 12 3 11 4 16 3 17 4 2Name: price, dtype: int64
我想从分组后的系列中获取趋势,并将其替换回数据框的price列。价格是相对于前一天价格的物品价格变化
day item price0 3 1 nan1 4 1 62 4 2 nan3 4 2 nan4 5 1 -25 5 2 16 5 3 nan7 5 3 nan8 5 4 nan9 6 3 610 6 4 1
请帮助我编写最后一步的代码。最好是一两行代码。因为实际的数据框非常大,我希望避免使用迭代。
回答:
希望这对你有帮助!
#获取平均值 mean_df=df1.groupby(['day','item'])['price'].mean().reset_index() #重命名列 mean_df.columns=['day','item','average_price'] #按天和物品升序排序 mean_df=mean_df.sort_values(by=['day','item']) #为每个物品和每一天移动价格 mean_df['shifted_average_price'] = mean_df.groupby(['item'])['average_price'].shift(1) #与原始df合并 df1=pd.merge(df1,mean_df,on=['day','item']) #用前一天的差异替换价格 df1['price']=df1['price']-df1['shifted_average_price'] #删除不需要的列 df1.drop(['average_price', 'shifted_average_price'], axis=1, inplace=True)