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 的第一行.
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)
| 归档时间: |
|
| 查看次数: |
38963 次 |
| 最近记录: |