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

jef*_*ott 30 python dataframe pandas

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

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

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

df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.values[1:])
Run Code Online (Sandbox Code Playgroud)

chr*_*ock 56

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

df['B_shifted'] = df.groupby(['A'])['B'].shift(1)
Run Code Online (Sandbox Code Playgroud)

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

  • 我得到所有行 NaN (8认同)
  • @AshokRayal可能由于每个groupby只有一行,当移位时,它变为NaN。 (2认同)

abe*_*bop 17

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

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

或类似的

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

当然,前一种符号更灵活(例如,如果你想换2).


Mik*_*ike 12

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
Run Code Online (Sandbox Code Playgroud)

  • shift 的默认参数是 1,因此不需要设置 `shift(1)`,尽管通过指定它可以使代码更清晰 (2认同)