Python 用另一列上的条件填充一列,并在另一列中移动值

Python 用另一列上的条件填充一列,并在另一列中移动值,python,pandas,Python,Pandas,我的数据框看起来像这样 №№№ randomNumCol n_k 0 5 1 1 6 0 2 7 1 3 8 0 4 9 1 5 10 1 6 11 1 7 12 1 ... №№№ randomNumCol n_k 0

我的数据框看起来像这样

      №№№   randomNumCol    n_k
 0     5          1
 1     6          0 
 2     7          1
 3     8          0 
 4     9          1
 5    10          1
 6    11          1
 7    12          1
...
      №№№   randomNumCol    n_k
 0     5          1          2
 1     6          0          2
 2     7          1          7
 3     8          0          7
 4     9          1          9
 5    10          1         10 
 6    11          1         11
 7    12          1         12
...
我需要按如下方式填充一列n_k:如果列中的randomNumCol为1,则从列中复制该值№№№. 如果为0,则插入n_k列中的上一个值

但是n_k列中的第一个值应该等于2,因为现在我不知道为什么会这样

应该是这样的

      №№№   randomNumCol    n_k
 0     5          1
 1     6          0 
 2     7          1
 3     8          0 
 4     9          1
 5    10          1
 6    11          1
 7    12          1
...
      №№№   randomNumCol    n_k
 0     5          1          2
 1     6          0          2
 2     7          1          7
 3     8          0          7
 4     9          1          9
 5    10          1         10 
 6    11          1         11
 7    12          1         12
...
我的代码没有给出正确的结果

dftest['n_k'] = np.where(dftest['randomNumCol'] == 1, dftest['№№№'], dftest['n_k'].shift(1)) 
我不太懂如何使用shift。那么如何处理n_k中的第一个单元格,它应该始终是2


有什么建议吗?

您可以从№№№' 列,其中randomNumCol为1,将剩余值设置为nan,然后使用ffill填充缺少的值:

import pandas as pd
df['n_k'] = df['№№№'].where(df.randomNumCol == 1, pd.np.nan)
df['n_k'].iat[0] = 2
df['n_k'] = df['n_k'].ffill().astype(df['№№№'].dtype)

df
# №№№   randomNumCol    n_k
#0  5              1    2
#1  6              0    2
#2  7              1    7
#3  8              0    7
#4  9              1    9
#5  10             1    10
#6  11             1    11
#7  12             1    12

您可以从'№№№' 列,其中randomNumCol为1,将剩余值设置为nan,然后使用ffill填充缺少的值:

import pandas as pd
df['n_k'] = df['№№№'].where(df.randomNumCol == 1, pd.np.nan)
df['n_k'].iat[0] = 2
df['n_k'] = df['n_k'].ffill().astype(df['№№№'].dtype)

df
# №№№   randomNumCol    n_k
#0  5              1    2
#1  6              0    2
#2  7              1    7
#3  8              0    7
#4  9              1    9
#5  10             1    10
#6  11             1    11
#7  12             1    12
您可以使用fillna代替shift

您可以使用fillna代替shift


+1你也是。我认为您不需要df['n_k']=np.nan,因为如果在执行赋值时缺少值,它将默认为nan。您也需要+1。我认为您不需要df['n_k']=np.nan,因为如果赋值时缺少该值,它将默认为nan。