首页 文章

熊猫:将组中的值向下移动一行

提问于
浏览
19

我有一个Pandas数据帧,我想创建一个新列,其值是另一列的值,向下移动一行 . 最后一行应该显示NaN .

问题是我希望按组执行此操作,每组的最后一行显示NaN . 没有组的最后一行“窃取”来自恰好在数据帧中相邻的组的值 .

我试图实施是非常可耻的,所以我显然误解了一些基本的东西 .

df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.values[1:])

3 回答

  • 11

    Shift适用于groupby子句的输出:

    >>> df = pandas.DataFrame(numpy.random.randint(1,3, (10,5)), columns=['a','b','c','d','e'])
    >>> df
       a  b  c  d  e
    0  2  1  2  1  1
    1  2  1  1  1  1
    2  1  2  2  1  2
    3  1  2  1  1  2
    4  2  2  1  1  2
    5  2  2  2  2  1
    6  2  2  1  1  1
    7  2  2  2  1  1
    8  2  2  2  2  1
    9  2  2  2  2  1
    
    
    for k, v in df.groupby('a'):
        print k
        print 'normal'
        print v
        print 'shifted'
        print v.shift(1)
    
    1
    normal
       a  b  c  d  e
    2  1  2  2  1  2
    3  1  2  1  1  2
    shifted
        a   b   c   d   e
    2 NaN NaN NaN NaN NaN
    3   1   2   2   1   2
    2
    normal
       a  b  c  d  e
    0  2  1  2  1  1
    1  2  1  1  1  1
    4  2  2  1  1  2
    5  2  2  2  2  1
    6  2  2  1  1  1
    7  2  2  2  1  1
    8  2  2  2  2  1
    9  2  2  2  2  1
    shifted
        a   b   c   d   e
    0 NaN NaN NaN NaN NaN
    1   2   1   2   1   1
    4   2   1   1   1   1
    5   2   2   1   1   2
    6   2   2   2   2   1
    7   2   2   1   1   1
    8   2   2   2   1   1
    9   2   2   2   2   1
    
  • 8

    较新版本的pandas现在可以在一个组上执行 shift

    df['B_shifted'] = df.groupby(['A'])['B'].shift(1)
    

    注意,当向下移动时,它是具有NaN的第一行 .

  • 34

    @ EdChum的评论对这个问题是一个更好的答案,所以我在这里发帖给后人:

    df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.shift())

    或类似的

    df['B_shifted'] = df.groupby(['A'])['B'].transform('shift') .

    当然,前一种表示法更灵活(例如,如果你想换2) .

相关问题