我有一个Pandas数据帧,我想创建一个新列,其值是另一列的值,向下移动一行 . 最后一行应该显示NaN .
问题是我希望按组执行此操作,每组的最后一行显示NaN . 没有组的最后一行“窃取”来自恰好在数据帧中相邻的组的值 .
我试图实施是非常可耻的,所以我显然误解了一些基本的东西 .
df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.values[1:])
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
较新版本的pandas现在可以在一个组上执行 shift :
shift
df['B_shifted'] = df.groupby(['A'])['B'].shift(1)
注意,当向下移动时,它是具有NaN的第一行 .
@ EdChum的评论对这个问题是一个更好的答案,所以我在这里发帖给后人:
df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.shift())
或类似的
df['B_shifted'] = df.groupby(['A'])['B'].transform('shift') .
df['B_shifted'] = df.groupby(['A'])['B'].transform('shift')
当然,前一种表示法更灵活(例如,如果你想换2) .
3 回答
Shift适用于groupby子句的输出:
较新版本的pandas现在可以在一个组上执行
shift
:注意,当向下移动时,它是具有NaN的第一行 .
@ EdChum的评论对这个问题是一个更好的答案,所以我在这里发帖给后人:
df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.shift())
或类似的
df['B_shifted'] = df.groupby(['A'])['B'].transform('shift')
.当然,前一种表示法更灵活(例如,如果你想换2) .