Pandas 如何移动多个列的整个组

Pandas 如何移动多个列的整个组,pandas,group-by,shift,Pandas,Group By,Shift,我有一个如下所示的数据帧: import pandas as pd import numpy as np np.random.seed(22) df = pd.DataFrame.from_dict({'a': np.random.rand(200), 'b': np.random.rand(200), 'x': np.tile(np.concatenate([np.repeat('F', 5), np.repeat('G', 5)]), 20)}) df.index = pd.MultiInd

我有一个如下所示的数据帧:

import pandas as pd
import numpy as np
np.random.seed(22)
df = pd.DataFrame.from_dict({'a': np.random.rand(200), 'b': np.random.rand(200), 'x': np.tile(np.concatenate([np.repeat('F', 5), np.repeat('G', 5)]), 20)})
df.index = pd.MultiIndex.from_product([[1, 2], list(range(0, 10)), [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]])
df.index.names = ['g_id', 'm_id', 'object_id']
我想将
['g_id',m_id']
定义的整个组的值进行移位,例如:

  • 新数据帧的索引
    (1,1,1)
    ['a','b']
    列的值将是原始数据帧的索引
    (1,0,1)
    中的值,即
    [0.208461,0.980866]
  • 新数据帧的索引
    (2,4,3)
    ['a','b']
    列的值将是原始数据帧的索引
    (2,3,3)
    中的值,即
    [0.651138,0.559126]

该操作与中所述的操作类似。但是,我需要对多个列执行此操作,并且我没有运气尝试概括提供的解决方案。

新数据帧的第一行中应该显示什么?0最多,但如果它将是
NaN
,那么我想我可以很容易地用
.fillna
填充它。实际上,不仅第一行缺少该值,而且引用
m_id==0的所有十行都缺少该值。这听起来可能很懒,但您能否将要移位的列转换为dict,弹出要上下移动的行,使用结果重新创建df,重置索引,并使用concatenate与原始datafame?新数据帧的第一行中应该显示什么?最多为0,但如果是
NaN
,我想我可以很容易地用
.fillna
填充它。实际上,不仅第一行缺少该值,而且引用
m_id==0的所有十行都缺少该值。这听起来可能很懒,但您能否将要移位的列转换为dict,弹出要上下移动的行,使用结果重新创建df,重置索引,并使用与原始datafame连接?