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 by
sum
。然后与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的意义,再次感谢。