将数据从第 1 行移动到第 0 行

Move data from row 1 to row 0

我用python写了这个函数。我想要这个东西显示行与生产列之间的差异。

这是代码

def print_df():
    mycursor.execute("SELECT * FROM productions")
 
    myresult = mycurson.fetchall()
    myresult.sort(key=lambda x: x[0])
    
    df = pd.DataFrame(myresult, columns=['Year', 'Production (Ton)'])
    df['Dif'] = abs(df['Production (Ton)']. diff())

    print(abs(df))

当然输出是这样的

    Year Production (Ton)       Dif

0   2010           339491       NaN
1   2011           366999   27508.0
2   2012           361986    5013.0
3   2013           329461   32525.0
4   2014           355464   26003.0
5   2015           344998   10466.0
6   2016           274317   70681.0
7   2017           200916   73401.0
8   2018           217246   16330.0
9   2019           119830   97416.0
10  2020            66640   53190.0

但我想要这样的输出

    Year Production (Ton)       Dif

0   2010           339491   27508.0    
1   2011           366999    5013.0
2   2012           361986   32525.0 
3   2013           329461   26003.0
4   2014           355464   10466.0
5   2015           344998   70681.0
6   2016           274317   73401.0
7   2017           200916   16330.0
8   2018           217246   97416.0
9   2019           119830   53190.0
10  2020            66640   66640.0

我应该更改或添加什么代码?

使用shift(-1)将所有行向上移动一位。

df['Dif'] = (df['Production (Ton)'] - df['Production (Ton)'].shift(-1).fillna(0)).abs()

请注意,通过设置 fillna(0),您可以避免 NaN。

你也可以使用 diff:

df['Dif'] = df['Production (Ton)'].diff().shift(-1).fillna(0).abs()

您可以使用 diff 的负句点输入来按您想要的方式获得差异,然后 fillnaProduction 列中的值填充最后一个值:

df['Dif'] = df['Production (Ton)'].diff(-1).fillna(df['Production (Ton)']).abs()

输出:

    Year  Production (Ton)      Dif
0   2010            339491  27508.0
1   2011            366999   5013.0
2   2012            361986  32525.0
3   2013            329461  26003.0
4   2014            355464  10466.0
5   2015            344998  70681.0
6   2016            274317  73401.0
7   2017            200916  16330.0
8   2018            217246  97416.0
9   2019            119830  53190.0
10  2020             66640  66640.0