Python 从上面的行中提取差异比率,并使用多索引将值存储在另一列中

Python 从上面的行中提取差异比率,并使用多索引将值存储在另一列中,python,pandas,rows,multi-index,difference,Python,Pandas,Rows,Multi Index,Difference,我想知道如何获得具有多索引列的两行之间的差异比率,并将它们存储在特定列中 我有一个数据框,看起来像这样 >>>df A B C total diff total diff total diff 2020-08-15 100 0 200 0 20 0 df_new

我想知道如何获得具有多索引列的两行之间的差异比率,并将它们存储在特定列中

我有一个数据框,看起来像这样

>>>df

                   A             B            C
                   total  diff   total  diff  total  diff 
  2020-08-15       100    0      200    0     20     0
df_new

                   A             B            C
                   total  diff   total  diff  total  diff 
  2020-08-16       200     -      50    -     30     -
每天,我都会增加一行。新的一排看起来像这样

>>>df

                   A             B            C
                   total  diff   total  diff  total  diff 
  2020-08-15       100    0      200    0     20     0
df_new

                   A             B            C
                   total  diff   total  diff  total  diff 
  2020-08-16       200     -      50    -     30     -
对于
diff
列,我想从上一行中取比率,取
total
的值。因此,公式将是
([total of today]-[total of the day])/[total of the day]

                   A             B              C
                   total  diff   total  diff    total  diff 
  2020-08-15       100    0      200    0       20     0
  2020-08-16       200    1.0    50     -0.75   30     0.5
我知道如何添加新行

day = dt.today()
df.loc[day.strftime("%Y-%m-%d"), :] = df_new.squeeze()

但我不知道如何才能得到两行多索引列之间的差异。。。任何帮助都将不胜感激!谢谢。

使用
shift
计算结果并更新原始df:

s = df.filter(like="total").rename(columns={"total":"diff"}, level=1)
res = ((s - s.shift(1))/s.shift(1))
df.update(res)

print (df)

               A          B           C     
           total diff total  diff total diff
2020-08-15   100  0.0   200  0.00    20  0.0
2020-08-16   200  1.0    50 -0.75    30  0.5

使用
shift
计算结果并更新原始df:

s = df.filter(like="total").rename(columns={"total":"diff"}, level=1)
res = ((s - s.shift(1))/s.shift(1))
df.update(res)

print (df)

               A          B           C     
           total diff total  diff total diff
2020-08-15   100  0.0   200  0.00    20  0.0
2020-08-16   200  1.0    50 -0.75    30  0.5
可以使用和更新多索引值

#df
#      A          B          C
#  total diff total diff total diff
#0   100    0   200    0    20    0

#df2
#       A          B          C
#   total diff total diff total diff
#0  200.0  NaN  50.0  NaN  30.0  NaN

# Take last row of current DataFrame i.e. `df`
curr = df.iloc[-1].xs('total', level=1) #Get total values
# Take total values of new DataFrame you get everyday i.e. `df2`
new = df2.iloc[0].xs('total',level=1)

# Calculate diff values
diffs = new.sub(curr).div(curr) # This is equal to `(new-curr)/curr`
idx = pd.IndexSlice
x = pd.concat([df, df2]).reset_index(drop=True)
x.loc[x.index[-1], idx[:,'diff']] = diffs.tolist()

x
       A           B           C
   total diff  total  diff total diff
0  100.0  0.0  200.0  0.00  20.0  0.0
1  200.0  1.0   50.0 -0.75  30.0  0.5
如果不想创建新的数据帧(
x
),请使用
DataFrame.append
追加值

一切都是一样的,直到步骤
idx=pd.indexlice
,不要创建
x
,而是将值附加到
df

df2.loc[:, idx[:,'diff']] = diffs.tolist()
df.append(df2)

       A           B           C
   total diff  total  diff total diff
0  100.0  0.0  200.0  0.00  20.0  0.0
0  200.0  1.0   50.0 -0.75  30.0  0.5
可以使用和更新多索引值

#df
#      A          B          C
#  total diff total diff total diff
#0   100    0   200    0    20    0

#df2
#       A          B          C
#   total diff total diff total diff
#0  200.0  NaN  50.0  NaN  30.0  NaN

# Take last row of current DataFrame i.e. `df`
curr = df.iloc[-1].xs('total', level=1) #Get total values
# Take total values of new DataFrame you get everyday i.e. `df2`
new = df2.iloc[0].xs('total',level=1)

# Calculate diff values
diffs = new.sub(curr).div(curr) # This is equal to `(new-curr)/curr`
idx = pd.IndexSlice
x = pd.concat([df, df2]).reset_index(drop=True)
x.loc[x.index[-1], idx[:,'diff']] = diffs.tolist()

x
       A           B           C
   total diff  total  diff total diff
0  100.0  0.0  200.0  0.00  20.0  0.0
1  200.0  1.0   50.0 -0.75  30.0  0.5
如果不想创建新的数据帧(
x
),请使用
DataFrame.append
追加值

一切都是一样的,直到步骤
idx=pd.indexlice
,不要创建
x
,而是将值附加到
df

df2.loc[:, idx[:,'diff']] = diffs.tolist()
df.append(df2)

       A           B           C
   total diff  total  diff total diff
0  100.0  0.0  200.0  0.00  20.0  0.0
0  200.0  1.0   50.0 -0.75  30.0  0.5