Partition pandas .diff() in multi-index level

删除回忆录丶 提交于 2019-12-12 10:42:59

问题


My question relates to calling .diff() within the partition of a multi index level

In the following sample the output of the first

df.diff() is

               values
Greek English        
alpha a           NaN
      b             2
      c             2
      d             2
beta  e            11
      f             1
      g             1
      h             1

But I want it to be:

               values
Greek English        
alpha a           NaN
      b             2
      c             2
      d             2
beta  e            NaN
      f             1
      g             1
      h             1

Here is a solution, using a loop but I am thinking I can avoid that loop!

import pandas as pd
import numpy as np

df = pd.DataFrame({'values' : [1.,3.,5.,7.,18.,19.,20.,21.],
   'Greek' : ['alpha', 'alpha', 'alpha', 'alpha','beta','beta','beta','beta'],
   'English' : ['a', 'b', 'c', 'd','e','f','g','h']})

df.set_index(['Greek','English'],inplace =True)
print df

# (1.) This is not the type of .diff() i want.
# I need it to respect the level='Greek' and restart   
print df.diff()


# this is one way to achieve my desired result but i have to think
# there is a way that does not involve the need to loop.
idx = pd.IndexSlice
for greek_letter in df.index.get_level_values('Greek').unique():
    df.loc[idx[greek_letter,:]]['values'] = df.loc[idx[greek_letter,:]].diff()

print df

回答1:


Just groupby by level=0 or 'Greek' if you prefer and then you can call diff on values:

In [179]:

df.groupby(level=0)['values'].diff()
Out[179]:
Greek  English
alpha  a         NaN
       b           2
       c           2
       d           2
beta   e         NaN
       f           1
       g           1
       h           1
dtype: float64


来源:https://stackoverflow.com/questions/29944652/partition-pandas-diff-in-multi-index-level

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!