对多索引 pandas 数据帧的值进行排序并计算差异

Sort value and calculate difference for multiindex pandas dataframe

我有一个这样的 pandas 数据框,其中 place1place2 是索引,我想按 data 值对索引 place2 进行排序,在不打乱索引 place1 顺序的情况下,即 place2 列对于每个 place1 变为 a, c, b。有办法吗?

place1 place2 data
 sss     a    100
         b    300
         c    200
 ses     a    400
         b    600
         c    500
  ...   ...   ... 

我还想为每个place1计算place2 == bplace2 == a之间的data差异,即dataframe变为

place1 place2 data diff
 sss     a    100  200
         b    300
         c    200
 ses     a    400  200
         b    600
         c    500
  ...   ...   ...  ...

有没有像这样计算差异的有效方法?提前致谢!

你可以.groupby()然后计算每组的差异:

groups = df.groupby(level=0, group_keys=False, sort=False)
df['diff'] = groups.transform(lambda x: x.xs('b', level='place2').iloc[0] - x.xs('a', level='place2').iloc[0])

它将值添加到组的每一行 - 但如果需要,您可以在之后删除“重复项”。

>>> df
               data  diff
place1 place2            
sss    a        100   200
       b        300   200
       c        200   200
ses    a        400   200
       b        600   200
       c        500   200

然后您可以对每个组中的 data 列进行排序

>>> groups.apply(lambda x: x.sort_values('data'))
               data  diff
place1 place2            
sss    a        100   200
       c        200   200
       b        300   200
ses    a        400   200
       c        500   200
       b        600   200