Python 如何动态独立地移动数据帧中的列?
我希望实现的是能够使我的值正常化,以便它们都从任意的零日开始。想象一下下面的数据帧:Python 如何动态独立地移动数据帧中的列?,python,pandas,Python,Pandas,我希望实现的是能够使我的值正常化,以便它们都从任意的零日开始。想象一下下面的数据帧: df = pd.DataFrame(np.array([[1, 0, 0], [4, 5, 0], [7, 8, 9], [7, 8, 9], [4, 5, 0], [7, 8, 9]]), columns=['a', 'b', 'c'], index = ['1/1/2000', '1/1/2001', '1/1/2002', '1/1/2003',
df = pd.DataFrame(np.array([[1, 0, 0], [4, 5, 0], [7, 8, 9], [7, 8, 9], [4, 5, 0], [7, 8, 9]]),
columns=['a', 'b', 'c'],
index = ['1/1/2000', '1/1/2001', '1/1/2002', '1/1/2003', '1/1/2004', '1/1/2005'])
其结果如下:
a b c
1/1/2000 1 0 0
1/1/2001 4 5 0
1/1/2002 7 8 9
1/1/2003 7 8 9
1/1/2004 4 5 0
1/1/2005 7 8 9
我试图实现的是在每列中找到第一个非零值,并将该列中的值移到索引零。因此,最终的数据帧看起来与此类似:
a b c
1/1/2000 1 5 9
1/1/2001 4 8 9
1/1/2002 7 8 0
1/1/2003 7 5 9
1/1/2004 4 8 0
1/1/2005 7 0 0
我试着用轮班,我可以用这样的方式:
df.b = df.b.shift(periods = -1, fill_value = 0)
但目前我还不知道有什么不使用for循环的熊猫友好方式
如果有人能帮助您找到第一个非零值,然后将值正确地移到索引零,请欣赏。首先通过比较不等于的值来获得移位数,然后添加累积和,比较
0
和最后一次计数True
s bysum
。然后与lambda函数一起使用,并为换档选择系列的值
:
s = df.ne(0).cumsum().eq(0).sum()
df = df.apply(lambda x: x.shift(periods = -s[x.name], fill_value = 0))
print (df)
a b c
1/1/2000 1 5 9
1/1/2001 4 8 9
1/1/2002 7 8 0
1/1/2003 7 5 9
1/1/2004 4 8 0
1/1/2005 7 0 0
谢谢你非常聪明的回答,你能解释一下为什么第二行可以工作吗?我刚接触熊猫,并将我目前的项目作为学习机会。我对-s[x.name]特别感到困惑,我知道s是一个数据系列,但我不能理解x指的是什么以及x.name对s的意义,再次感谢。