我有一个dataframe
与有关销售一些产品的信息(单元):
unit year month price
0 1 2018 6 100
1 1 2013 4 70
2 2 2015 10 80
3 2 2015 2 110
4 3 2017 4 120
5 3 2002 6 90
6 4 2016 1 55
我想为每笔交易添加一栏,其中包含有关先前交易的信息,如果没有先前的交易,则列出NaN。
unit year month price prev_price prev_year prev_month
0 1 2018 6 100 70.0 2013.0 4.0
1 1 2013 4 70 NaN NaN NaN
2 2 2015 10 80 110.0 2015.0 2.0
3 2 2015 2 110 NaN NaN NaN
4 3 2017 4 120 90.0 2002.0 6.0
5 3 2002 6 90 NaN NaN NaN
6 4 2016 1 55 NaN NaN NaN
此刻,我正在单元上执行一些grouping
,保留那些具有多行的内容,然后提取与最小日期相关联的这些单元的信息。然后用我的原表保存加入此表只显示有已合并了2台在不同的日期行。
我觉得有一个更简单的方法来做到这一点,但我不知道怎么样。
答案 0 :(得分:1)
使用DataFrameGroupBy.shift
与add_prefix
和join
追加新的DataFrame
到原始:
#if real data are not sorted
#df = df.sort_values(['unit','year','month'], ascending=[True, False, False])
df = df.join(df.groupby('unit', sort=False).shift(-1).add_prefix('prev_'))
print (df)
unit year month price prev_year prev_month prev_price
0 1 2018 6 100 2013.0 4.0 70.0
1 1 2013 4 70 NaN NaN NaN
2 2 2015 10 80 2015.0 2.0 110.0
3 2 2015 2 110 NaN NaN NaN
4 3 2017 4 120 2002.0 6.0 90.0
5 3 2002 6 90 NaN NaN NaN
6 4 2016 1 55 NaN NaN NaN